我有一个我在存储过程中创建的动态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)
这样做的正确方法是什么?
我想使用数据库游标; 首先,我需要了解它的用途和语法是什么,以及在哪种情况下我们可以在存储过程中使用它?不同版本的SQL Server是否有不同的语法?
什么时候需要使用?
如在主题中.我可以简单地将光标的位置重置为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) 我读过一本名为"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(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) 使用SQL 2005/2008
我必须使用前向光标,但我不想遭受糟糕的性能.有没有更快的方法我可以循环而不使用游标?
t-sql sql-server sql-server-2005 sql-server-2008 database-cursor
我有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子句吗?或者有更好的方法来实现这一目标吗?
我有一个 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)检索对象,并且我还能够使用游标迭代所有对象。这是一个工作演示。
我现在想做的是让所有具有特定角色的用户 - 例如。检索所有管理员,而不迭代整个对象存储。
我怎样才能做到这一点?
我不明白以下行的含义:
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?
谢谢
我想使用 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。
database-cursor ×10
sql-server ×4
t-sql ×4
oracle ×3
plsql ×3
dynamic-sql ×1
indexeddb ×1
java ×1
java-stream ×1
javascript ×1
ora-00932 ×1
ram ×1
sql ×1
toad ×1