学习显式游标并尝试创建我的第一个游标:
SET SERVEROUTPUT ON
DECLARE
v_ename EMP.FIRST_NAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT first_name, salary FROM emp;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename, v_salary;
DBMS_OUTPUT.PUT_LINE('Employee Details ' || v_ename || ' ' || v_salary)
FETCH c_emp INTO v_ename, v_salary;
DBMS_OUTPUT.PUT_LINE('Employee Details ' || v_ename || ' ' || v_salary)
CLOSE c_emp;
END;
Run Code Online (Sandbox Code Playgroud)
但它给了我:
FETCH c_emp INTO v_ename, v_salary;
*
ERROR at line 10:
ORA-06550: line 10, column 3:
PLS-00103: Encountered the symbol "FETCH" when expecting one of the following: …Run Code Online (Sandbox Code Playgroud) 我最近读过关于应该如何避免游标的内容.好吧,我想知道我对它们的使用是否合适.
我正在创建一个可在线工作的脚本引擎(嵌入在页面,服务器端)此脚本引擎将由本产品的"高级"最终用户使用.然而,该产品与数据库非常相似,并且脚本语言类似于C语言,但简化为类似于PHP的地方.对于数据库,我基本上需要这样的语法,因为它是语言中最一致的语法,没有最终用户必须手写SQL代码(如果我们要让他们这样做,为什么他们不能跳过脚本引擎作为它的生活更简单).语法是这样的:
declare DataSet $data("tablename","OtherID="+$oid);
//Dataset(string tablename,string where_clause_addon)
$data["field1"]="the data of field... ";
$data.Next();
$data["field1"]="The data of the next row";
$data[10]["field1"]="The data of the 10th row";
Run Code Online (Sandbox Code Playgroud)
我通过为每个DataSet创建一个全局游标(我只在应用程序中使用1个连接)然后让全局游标跟踪当前行位置(它也是一个SCROLL和UPDATE游标)来内部控制它.这使我的生活变得更加简单,否则我将被迫编写自己的SQL控件来对抗.Net的糟糕DataReader.
游标的使用是否正常?请注意,具有这些脚本的页面将无法在全球范围内访问,仅适用于客户端(因此可能只有3-10个用户同时访问).
有没有人看到更好的方法来跟踪当前的变量位置?(因为这些能够解决未知模式的表)
另外,使用这样的游标我会遇到并发问题吗?(我的文档说游标是连接的全局,并且每个页面请求在现场建立新连接,因此用户不共享连接)
我有一个数据库,可以记录员工参加课程的时间以及下次参加课程的时间(课程往往是年度课程).
例如,以下员工于2010年1月1日参加了"1"课程,并且由于课程是年度课程,将于2011年1月1日参加.由于今天是2010年5月20日,课程状态显示为"完成",即他们已经完成了课程,直到明年才需要再做一遍:
EmployeeID CourseID AttendanceDate DueDate Status
123456 1 01/01/2010 01/01/2011 Complete
Run Code Online (Sandbox Code Playgroud)
在DueDate我更新员工的记录时,我在SQL中计算这一点,例如DueDate = AttendanceDate + CourseFrequency(我从一个单独的表中提取课程频率).
在我的基于Web的应用程序(asp.net mvc)中,我为所有员工提取这些数据,并以类似网格的格式显示,供人力资源经理审核.这使得人力资源部门可以确定谁需要参加课程.
我的问题如下.
以上面的例子为例,假设今天是2011年1月2日.在这种情况下,员工123456现在已经过期了,我想设置Status为Incomplete,以便HR经理可以看到他们需要采取行动,即让员工参与课程.
我可以在数据库中构建一个触发器,在一夜之间运行,Status根据当前日期更新所有员工的字段.从我所看到的,我将需要使用游标循环每一行来修改状态,这被认为是不好的做法/低效或至少要避免的事情,如果你可以???
或者,Status在我从数据库中撤回数据之后,在我将其显示在屏幕上之前,我可以在我的C#代码中计算.这个问题是Status数据库中的内容不一定与屏幕上显示的内容相匹配,这对我来说是完全错误的.
有没有人对这种问题的最佳实践方法有任何建议?
它有帮助,如果我使用游标我怀疑我会在任何给定时间循环超过1000条记录.也许这个数量很小,使用游标是可以的吗?
我正在尝试为Android中的应用创建登录屏幕.我已将有关用户的信息存储在数据库的"用户"表中.我正在尝试使用光标对象将登录屏幕中输入的用户名和密码与数据库中的值进行匹配,但它不起作用,导致应用程序崩溃.有人可以推荐或修改方法,如果可能的话,可以使用一些代码片段.非常感谢大家,谢谢.
下面是LoginForm类的代码.(它使用DBAdapter类连接到数据库)
package com.androidbook.LoginForm;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Toast;
public class LoginForm extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final DBAdapter db = new DBAdapter(getBaseContext());
final AutoCompleteTextView username = (AutoCompleteTextView)this.findViewById(R.id.AutoComUsernameLogin);
final AutoCompleteTextView password = (AutoCompleteTextView)this.findViewById(R.id.AutoComPasswordLogin);
Button Register = (Button) findViewById(R.id.ClicktoRegister);
Register.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent myIntent = new Intent(view.getContext(), RegistrationForm.class);
startActivityForResult(myIntent, 0); …Run Code Online (Sandbox Code Playgroud) 我将实现该方法来检索字符串的记录,但是当涉及到执行时,它会像Log cat所说的那样变成运行时错误.您能否告诉我们如何正确初始化光标?
logcat的
07-08 10:10:34.620: D/result(8036): true
07-08 10:10:34.660: D/memalloc(8036): ion: Unmapping buffer base:0x57c06000 size:466944
07-08 10:10:34.660: D/memalloc(8036): ion: Unmapping buffer base:0x57d6c000 size:466944
07-08 10:10:34.660: D/memalloc(8036): ion: Unmapping buffer base:0x57cbb000 size:466944
07-08 10:10:34.710: D/debug(8036): Order 87318702
07-08 10:10:34.710: D/pcDbHelper(8036): pcDbHelper com.example.recordandmovie.PhotoDbAdapter@412cad30
07-08 10:10:34.841: W/CursorWindow(8036): Window is full: requested allocation 1249663 bytes, free space 398939 bytes, window size 2097152 bytes
07-08 10:10:34.931: W/CursorWindow(8036): Window is full: requested allocation 1249663 bytes, free space 398939 bytes, window size 2097152 bytes
07-08 10:10:34.941: D/debug …Run Code Online (Sandbox Code Playgroud) //这不起作用 它显示第一个记录并在此之后停止.我想要一个即使在最后一条记录之后也能继续运行的循环.我明白了光标从位置0开始
.//代码
cur=db.getData(position);
switch(v.getId())
{
case R.id.next :
{
if (cur != null && cur.getCount()> 0 && position < cur.getCount() && position != cur.getCount()){
cur.moveToPosition(position);
textView1.setText(""+cur.getString(1));// Display Columns
position++;
cur.moveToNext();
}
}
Run Code Online (Sandbox Code Playgroud)
//我想要一个循环来显示记录号
下一个按钮,例如:
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
后退按钮例如:
5 4 3 2 1 5 4 3 2 1
Run Code Online (Sandbox Code Playgroud)
随机按钮例如:
3 4 5 1
5 1 2 3
4 5 1 2
Run Code Online (Sandbox Code Playgroud) 我正在尝试执行以下过程.我所拥有的是,在wo_list的最开始有一个sql,我需要迭代它并将此wo_list中的pyid值传递给另一个我需要创建另一个游标的查询.所以我打开一个for循环,启动我的wo_list游标循环,现在在这个循环中我需要通过传递wo_list中的一个值来从另一个查询创建另一个游标.
CREATE OR REPLACE
PROCEDURE FIX_DIMS_DOC_PROD_DATA_1
AS
tempivaultprod VARCHAR(8);
tempivaultdoc VARCHAR(8);
CURSOR wo_list
IS
SELECT A.Pyid,
A.Pxcreatedatetime,
A.Pxcreateoperator,
A.Pxcreateopname,
A.Packageid,
E.Doc_Desc,
A.Concat_Prod_Desc,
A.Primary_Ecid,
A.Primary_Cust_Name,
A.Isnamdocument,
A.PYSTATUSWORK,
F.Req_No,
F.Req_Src,
A.concat_prod_id,
A.documenttypeid
FROM DIMS_DOC_MASTER A,
Dims_Doc_Map_Product B,
Dims_Doc_Type E ,
Dims_Doc_Asctd_Req_Dtl F
WHERE B.Dims_Doc_Id = A.PYID
AND NOT EXISTS
(SELECT 1
FROM Dims_Prod_Type_Doc_Type C
WHERE C.DIMS_PROD_ID = B.Dimsdocprodid
AND C.Doc_Type_Id = A.Documenttypeid
)
AND E.Doc_Id = A.Documenttypeid
AND A.PYID = F.DIMS_DOC_ID (+);
BEGIN
FOR DIMS_DOC_REC IN wo_list
LOOP
BEGIN
CURSOR wo_list1
IS …Run Code Online (Sandbox Code Playgroud) 我的ViewController包含一个TextField.如何让Cursor转到TextField?
我正在考虑一个类似于此的方法 - 但是要为Cursor添加什么来跳转到TextField允许用户在调用此方法时开始键入?
func reloadEntries() {
self.txtfield?.becomeFirstResponder()
...
}
Run Code Online (Sandbox Code Playgroud) 我不知道为什么这么慢
DECLARE kursor CURSOR FOR
SELECT mediatime, ShortDate, MediaDateID, TimeID
FROM DateTimeMCross
DECLARE @mediatime INT, @ShortDate DATE, @MediaDateID INT, @TimeID INT, @tmpDate DATE
SET @mediatime = 0;
OPEN kursor
FETCH NEXT FROM kursor INTO @mediatime, @ShortDate, @MediaDateID, @TimeID
WHILE @@FETCH_STATUS = 0
BEGIN
/*SET @tmpDate = (select DATEADD(day,-1,@shortDate))*/
IF @mediatime >= 2400
BEGIN
UPDATE DateTimeMCross
SET DateTimeMCross.newMediaDateID = 2/*(SELECT YEAR(@tmpDate) * 10000 + MONTH(@tmpDate) * 100 + DAY(@tmpDate))*/
WHERE DateTimeMCross.MediaDateID = @MediaDateID
AND DateTimeMCross.TimeID = @TimeID
END
ELSE IF @mediatime …Run Code Online (Sandbox Code Playgroud) 我是Java的新手.我只是在Collection Framework中寻找Iterator.但现在我想通过使用Iterator的remove()方法从ArrayList中删除所有null.所以尝试了下面的代码,但我没有得到预期的输出,因为我想要一个没有任何空值的列表.请解释一下谢谢.
这是我的代码
package setinterface;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class InternalWorkingOfArrayList {
public static void main(String[] args) {
List<String> setOfString = new ArrayList<String>();
setOfString.add("A");
setOfString.add("B");
setOfString.add("C");
setOfString.add("B");
setOfString.add(null);
setOfString.add("A");
setOfString.add(null);
Iterator<String> iterator = setOfString.iterator();
while (iterator.hasNext()) {
String string = (String) iterator.next();
if (null==string) {
iterator.remove();
break;
}
}
for (String string1 : setOfString) {
System.out.println(string1);
}
}
}
Run Code Online (Sandbox Code Playgroud) cursor ×10
android ×3
sql ×3
sql-server ×3
oracle ×2
performance ×2
sqlite ×2
arraylist ×1
collections ×1
concurrency ×1
iterator ×1
java ×1
login ×1
oracle11g ×1
swift ×1
textfield ×1
while-loop ×1