标签: cursors

CURSOR 中的无限循环

我正在尝试使用游标来清理不再需要的临时表。我有一个小表,其中包含临时表的名称和标识符。游标陷入无限循环,但前提是我在其中执行某些语句。如果我只是打印出 中的值FETCH,它就可以完美运行。这是代码。

DECLARE @id bigint;
DECLARE @table_name varchar(max);

DECLARE st CURSOR LOCAL FAST_FORWARD FOR 
SELECT ID, TableName FROM SearchTables WHERE CustomerID IS NULL

OPEN st
FETCH NEXT FROM st INTO @id, @table_name
WHILE @@FETCH_STATUS <> -1 
BEGIN   
    IF(OBJECT_ID(@table_name) IS NOT NULL) 
        EXEC('DROP TABLE ' + @table_name);

    UPDATE SearchTables SET Deleted=1 WHERE ID=@id;

    PRINT CAST(@id AS varchar(max)) + ' ' + @table_name;

    FETCH NEXT FROM st INTO @id, @table_name;
END 

CLOSE st
DEALLOCATE st
Run Code Online (Sandbox Code Playgroud)

如果我注释掉这些行

    IF(OBJECT_ID(@table_name) IS NOT NULL) …
Run Code Online (Sandbox Code Playgroud)

t-sql cursors

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

查看 SQL 2008 sp_cursorexecute 底层查询和执行计划

我性能调优Dynamics AX的应用程序,看到一个SQL跟踪长时间运行,高I / O查询的形式exec sp_cursorexecute 1073742882 ...。当我尝试运行在一个新的SQL Management Studio中的窗口,查询,我得到一个错误Could not find prepared statement with handle 1073742882.我”我不确定,但似乎缓存计划是特定于连接的。我无sp_cursorprepare迹可寻;重复用例会显示相同的准备好的句柄 ID 和新游标。由于它是我要连接的共享环境,因此我想我必须重置应用服务器并跟踪其启动才能看到它。

  • 有什么办法可以使用游标准备好的句柄ID来查看底层查询吗?
  • 有没有办法将一行dm_exec_cached_plans与这个游标相关联?
  • 有没有办法通过dm_exec_query_plan或其他方式查看执行计划?

sql-server-2008 execution-plan cursors

5
推荐指数
1
解决办法
1631
查看次数

声明游标以遍历 SQL Server 2008 R2 中的某些值

我有一些业务部门,如印度、国际、美国、英国。

我必须:

  1. 使用与存储过程SP_Report结果集匹配的列创建表变量(虚拟内存表)
  2. 声明一个包含所有业务单位的游标,然后游标应该在 BU 上循环
  3. 对于每个 BU,执行一个存储过程调用SP_Report并将数据插入到表变量中
  4. 最后我必须从表变量+时间戳+BU中选择列,将它们插入另一个表并清除表变量。

代码:

declare @K table (BU nvarchar(max), K nvarchar(max),Y money, A money, D money, YP money)
declare @FY int
declare @BU nvarchar(max)

INSERT INTO @K (BU, K, Y, A, D, YP) 
    EXEC dbo.SP_Report '2012', 'India'

SELECT * FROM @K
Run Code Online (Sandbox Code Playgroud)

此代码返回表变量的结果。现在我必须使用它游标,我不知道如何使用。我怎样才能解决同样的问题。

sql-server-2008 cursors

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

MySQL:循环游标结果提前结束

我正在执行一个遍历游标结果的循环。代码位于触发器函数中,重要的部分如下所示:

编辑:对不起,愚蠢的错误。删除“one_table”后执行触发器。这与我在触发器代码中执行“删除”或“更新”操作的表不同(参见下面的第二个清单)

create trigger my_trigger after delete on one_table
for each row 
begin 

declare my_value int; 
declare num_rows int default 0; 
declare done int default false; 
declare my_cursor cursor for select value from table where condition; 
declare continue handler for sqlstate '02000' set done = 1; 

open my_cursor; 
select found_rows() into num_rows; 

-- This is just for debugging 
insert into log_table(key, value) values('foo', num_rows); 

if num_rows > 0 then: 
  repeat 
    fetch my_cursor into my_value; 
    -- Do stuff 
  until done …
Run Code Online (Sandbox Code Playgroud)

mysql trigger cursors

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

并行执行 SP(可能使用游标)

我们有一个在 SQL Server 2008 R2 上运行的第三方会计系统。要将发票插入这个会计系统,我们必须使用它附带的 API(它只是一组加密的 SP)。

我们的一些批处理需要插入大量(1,000 张)发票。所以,通常在 SQL 中你会写一个 INSERT 语句,它们会很快被插入。

但是,因为我们必须使用 SP 来插入行,所以我们目前有一个 C# 应用程序,它运行一个 PARALLEL FOR 循环并在每次迭代中调用一次 SP。

性能不是很好,虽然这很大程度上取决于 API SP 内部发生的事情,但我想知道 SQL Server 是否可以为我做些什么来提高性能。我知道我可以摆脱 C# 应用程序并在 T-SQL 中使用 CURSOR,但据我所知,这不会并行运行 - 对吗?

同样,我可以动态生成数千条 SQL 语句来调用具有不同参数的 SP,我想优化器可以看到加密的 SP 在做什么(当然比 C# 应用程序更好)并提出一个计划将尽可能多地并行运行它们。

parallelism sql-server-2008-r2 cursors

5
推荐指数
1
解决办法
2613
查看次数

如何在不保持事务打开的情况下保持结果集?

以下文档描述了如何查看从函数返回的 refcursor,这里,如下所示:

    CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
BEGIN
    OPEN $1 FOR SELECT col FROM test;
    RETURN $1;
END;
' LANGUAGE plpgsql;

BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN funccursor;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

这对我有用。但是,如果我想将结果保留在我的屏幕上,我必须保持事务处于打开状态。当我执行 COMMIT 时,我的结果集被丢弃。当我同时执行 FETCH 和 COMMIT 时,第一个结果集被丢弃。

有没有办法提交事务但保留结果集?PgAdmin 的版本是 1.18.1。

postgresql pgadmin cursors postgresql-9.3

5
推荐指数
1
解决办法
7544
查看次数

从返回 CURSOR 的函数中选择

我想从返回 SYS_REFCURSOR 类型值的函数中进行选择。

例如 :

CREATE OR REPLACE FUNCTION my_funtion (
        my_param IN VARCHAR2)
     RETURN SYS_REFCURSOR
  IS
     l_return   SYS_REFCURSOR;
  BEGIN
           OPEN l_return FOR
                SELECT last_name, first_name
                  FROM employees
                  WHERE id = my_param
              ORDER BY employee_id;
     RETURN l_return;
END my_funtion;
Run Code Online (Sandbox Code Playgroud)

我想做类似的事情:

select * from  my_function('id015');
Run Code Online (Sandbox Code Playgroud)

甚至 :

select alias.last_name from  my_function('id015') alias;
Run Code Online (Sandbox Code Playgroud)

oracle plsql cursors select

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

静态光标和当前位置

静态游标不允许修改数据,因为它是只读的,并且当使用“Where current of”执行时,它会按预期返回错误。到目前为止,一切都很好。但我惊讶地发现静态游标允许使用这样的变量修改数据。

DECLARE @nome varchar(100), @salario int,@idemp int
DECLARE contact_cursor  CURSOR STATIC FOR
SELECT empno,ename, sal FROM emp

OPEN contact_cursor;

FETCH NEXT from contact_cursor into @idemp,@nome, @salario WHILE @@FETCH_STATUS=0 BEGIN

If @salario < 5000
    Update Emp
    Set Sal = Sal * 1.1
    where empno=@idemp --No error and do the update
    --Where current of contact_cursor; --gives error

print @nome+' '+cast(@salario as varchar(100));
Run Code Online (Sandbox Code Playgroud)

FETCH NEXT from contact_cursor into @idemp,@nome, @salario END CLOSE contact_cursor; DEALLOCATE contact_cursor;

Run Code Online (Sandbox Code Playgroud) 问题是:在这次更新中使用“where current”和用光标提取的变量有什么区别?

sql-server t-sql cursors update

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

更改游标内的 SET 选项 - 基于兼容性级别的不同行为

我发现数据库兼容性级别之间的一段代码的行为存在差异,并想知道其原因是什么。下面是一个简单的示例,它迭代计数表并ROWCOUNT在第 50 次迭代时更改选项:

设置:

/* Create tally table */

SELECT  TOP 100
        ROW_NUMBER() OVER (ORDER BY a.object_id) AS Number
INTO    #Tally
FROM    sys.objects a
        CROSS JOIN sys.objects b;

/* Create Some databases with different compatibility levels */

CREATE DATABASE [100Compat] WITH COMPATIBILITY_LEVEL = 100
CREATE DATABASE [110Compat] WITH COMPATIBILITY_LEVEL = 110
CREATE DATABASE [120Compat] WITH COMPATIBILITY_LEVEL = 120
CREATE DATABASE [130Compat] WITH COMPATIBILITY_LEVEL = 130
Run Code Online (Sandbox Code Playgroud)

受影响的代码:

/* cursor through the tally table */
DECLARE MyCursor CURSOR
FOR
SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 cursors sql-server-2016 compatibility-level

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

为什么 CURSOR_STATUS 在创建它的存储过程中的输出游标返回意外结果?

我有一个具有该CURSOR VARYING类型的输出参数的存储过程。我想验证调用存储过程的代码是否可以使用输出游标。这似乎CURSOR_STATUS是正确使用的函数,但将其应用到输出光标时,我得到了意想不到的结果。该函数在创建它的存储过程内返回值 -3,但在存储过程外按预期工作。请参阅下面的代码:

CREATE OR ALTER PROCEDURE dbo.OutputCursorTest  
(@Cursor_OUT CURSOR VARYING OUTPUT)
AS  
BEGIN
    SET NOCOUNT ON;

    SET @Cursor_OUT = CURSOR FORWARD_ONLY STATIC FOR
    SELECT [high]
    from master..spt_values

    OPEN @Cursor_OUT;

    SELECT CURSOR_STATUS('variable', '@Cursor_OUT'); -- this seems to always return -3

    -- possible workaround
    /*
    DECLARE @Cur_Copy CURSOR;
    SET @Cur_Copy =  @Cursor_OUT;
    SELECT CURSOR_STATUS('variable', '@Cur_Copy');
    DEALLOCATE @Cur_Copy;
    */

    RETURN;
END;

GO     

DECLARE @Cur CURSOR;
EXEC dbo.OutputCursorTest @Cursor_OUT = @Cur OUTPUT;
SELECT CURSOR_STATUS('variable', '@Cur'); -- this returns 1 …
Run Code Online (Sandbox Code Playgroud)

sql-server cursors

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