标签: database-cursor

在存储过程中使用带有动态SQL的游标

我有一个我在存储过程中创建的动态SQL语句.我需要使用游标迭代结果.我很难搞清楚正确的语法.这就是我正在做的事情.

SELECT @SQLStatement = 'SELECT userId FROM users'

DECLARE @UserId

DECLARE users_cursor CURSOR FOR
EXECUTE @SQLStatment --Fails here. Doesn't like this

OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN

EXEC asp_DoSomethingStoredProc @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

t-sql stored-procedures dynamic-sql database-cursor

46
推荐指数
2
解决办法
20万
查看次数

SQL Server中游标的用途是什么?

我想使用数据库游标; 首先,我需要了解它的用途和语法是什么,以及在哪种情况下我们可以在存储过程中使用它?不同版本的SQL Server是否有不同的语法?

什么时候需要使用?

sql-server database-cursor

27
推荐指数
3
解决办法
15万
查看次数

我可以将光标的位置重置到开头吗?

如在主题中.我可以简单地将光标的位置重置为Transact-SQL中的开头,以便它可以在表上再次运行吗?我想在以下上下文中重置它:

DECLARE @userID INT
DECLARE user_cursor CURSOR FOR SELECT userID FROM users

WHILE /* some condition */
BEGIN
...

    FETCH NEXT FROM user_cursor INTO @userID

    IF @@FETCH_STATUS = 0
    BEGIN
        /*... here goes the reset of the cursor ...*/
    END

...
END
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server database-cursor

19
推荐指数
2
解决办法
3万
查看次数

SELECT COUNT(*)与使用显式游标提取两次

我读过一本名为"Oracle PL SQL Programming"(第2版)的书,由Steven Feuerstein和Bill Pribyl撰写.在页99,有一点建议

除非你真的需要知道"命中"的总数,否则不要从表中"选择COUNT(*)".如果您只需要知道是否有多个匹配,只需使用显式游标获取两次.

你能举个例子向我解释这一点吗?谢谢.

更新:

正如Steven Feuerstein和Bill Pribyl建议我们不要使用SELECT COUNT()来检查表中的记录是否存在,任何人都可以帮我编辑下面的代码,以避免使用显式游标而不是使用SELECT COUNT(*)吗?此代码是在Oracle存储过程中编写的.

我有一个表emp(emp_id,emp_name,...),所以检查提供的员工ID是否正确:

CREATE OR REPLACE PROCEDURE do_sth ( emp_id_in IN emp.emp_id%TYPE )
IS
v_rows INTEGER;
BEGIN
    ...

    SELECT COUNT(*) INTO v_rows
    FROM emp
    WHERE emp_id = emp_id_in;

    IF v_rows > 0 THEN
        /* do sth */
    END;

    /* more statements */
    ...

END do_sth;
Run Code Online (Sandbox Code Playgroud)

oracle plsql database-cursor

11
推荐指数
3
解决办法
3万
查看次数

ORA-00932:不一致的数据类型:预期 - 得到 -

我已经使用Oracle(10g.2)作为PHP程序员将近3年了,但是当我完成一项任务时,我第一次尝试使用ref游标和集合类型.当我遇到问题时,我在网上搜索过,这个ora-00932错误让我感到不知所措.我需要老手的帮助.

这是我一直在处理的问题,我想从表中选择行并将它们放在ref游标中,然后使用记录类型将它们收集在一个关联数组中.再次从这个关联数组中,创建一个引用游标.不要问我为什么,我正在写这么复杂的代码,因为我需要它来进行更复杂的分配.我可能会让你感到困惑,所以让我告诉你我的代码.

我在Toad的类型选项卡下定义了2种类型.其中一个是对象类型:

CREATE OR REPLACE
TYPE R_TYPE AS OBJECT(sqn number,firstname VARCHAR2(30), lastname VARCHAR2(30));
Run Code Online (Sandbox Code Playgroud)

另一个是使用上面创建的对象类型的集合类型:

CREATE OR REPLACE
TYPE tr_type AS TABLE OF r_type;
Run Code Online (Sandbox Code Playgroud)

然后我创建一个包:

CREATE OR REPLACE PACKAGE MYPACK_PKG IS
TYPE MY_REF_CURSOR IS REF CURSOR;
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR);
END MYPACK_PKG;
Run Code Online (Sandbox Code Playgroud)

包装体:

CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
 PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
  rcur MYPACK_PKG.MY_REF_CURSOR;
  sql_stmt VARCHAR2(1000);
  l_rarray   tr_type := tr_type();
                l_rec r_type;

 BEGIN
     sql_stmt :=  'SELECT 1,e.first_name,e.last_name  FROM hr.employees e ';
     OPEN rcur FOR sql_stmt;
     LOOP
       fetch …
Run Code Online (Sandbox Code Playgroud)

oracle toad plsql ora-00932 database-cursor

8
推荐指数
1
解决办法
4万
查看次数

什么是sql循环游标的替代方法?

使用SQL 2005/2008

我必须使用前向光标,但我不想遭受糟糕的性能.有没有更快的方法我可以循环而不使用游标?

t-sql sql-server sql-server-2005 sql-server-2008 database-cursor

7
推荐指数
3
解决办法
3万
查看次数

在oracle中动态添加where子句到游标

我有plsql程序,它接受某些参数,例如v_name,v_country,v_type.

我希望有一个带有select语句的游标,如下所示:

select column from table1 t1, table2 t2
where t1.name = v_name
and t1.country = v_country
and t1.id = t2.id
and t2.type = v_type
Run Code Online (Sandbox Code Playgroud)

如果某些参数为空,我只能在光标中添加相关的where子句吗?或者有更好的方法来实现这一目标吗?

oracle plsql database-cursor

6
推荐指数
2
解决办法
1万
查看次数

如何在IndexedDB中按属性查询对象?

我有一个 IndexedDB 对象存储,它存储以下结构的用户对象:

{ id: 1, name: "Peter", role: "admin", password: "someHash"}
Run Code Online (Sandbox Code Playgroud)

对象存储创建如下:

request.onupgradeneeded = function(event){
    var db = request.result;
    var objectStore = db.createObjectStore("users", { keyPath: "id", autoIncrement: true });

    objectStore.createIndex("uniqueNameIndex", "name", { unique: true  });
    objectStore.createIndex("roleIndex",       "role", { unique: false });
};
Run Code Online (Sandbox Code Playgroud)

我知道如何通过对象的键(id)检索对象,并且我还能够使用游标迭代所有对象。这是一个工作演示。

我现在想做的是让所有具有特定角色的用户 - 例如。检索所有管理员,而不迭代整个对象存储。

我怎样才能做到这一点?

javascript indexeddb database-cursor

6
推荐指数
1
解决办法
1535
查看次数

SQL游标获取状态含义

我不明白以下行的含义:

   WHILE 1 = 1 
   BEGIN
      FETCH NEXT FROM SomeCursor INTO @SomeId, @SomeOtherColumn

      IF @@FETCH_STATUS <> 0 BREAK
Run Code Online (Sandbox Code Playgroud)

1 = 1时有什么含义?如果获取状态不是0?

谢谢

sql t-sql sql-server database-cursor

6
推荐指数
3
解决办法
2万
查看次数

使用 Java Stream 使用数据库游标

我想使用 Java Stream 使用数据库游标。我希望 Java 流根据需要获取和处理行,并避免首先将所有 500 万行加载到内存中,然后再处理它们。

是否可以在不将整个表加载到 RAM 中的情况下使用它?

到目前为止我的代码如下所示:

Cursor<Product> products = DAO.selectCursor(...);

// 1. Initialize variables
long count = 0;
...
for (Iterator<Product> it = products.iterator(); it.hasNext();) {
  Product p = it.next();
  // 2. Processing each row
  ...
}
// 3. Concluding (processing totals, stats, etc.)
double avg = total / count;
...
Run Code Online (Sandbox Code Playgroud)

它确实工作得很好,但是有点麻烦,我想利用 Stream API。

java ram java-stream database-cursor

6
推荐指数
1
解决办法
2894
查看次数