标签: cursors

静态光标和当前位置

静态游标不允许修改数据,因为它是只读的,并且当使用“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
查看次数

PL/pgSQL 函数创建中的错误

我不知道这个问题是否更适合这里或 SO ...

这是我想启动的脚本(该函数的代码是从 SO 上的一个问题复制的):

\c mydb

create or replace function truncate_tables(username in varchar) returns void as $$
declare
    stmt RECORD;
    statements cursor for select tablename from pg_tables where tableowner = username;
begin 
    for stmt in statements loop
        execute 'truncate table ' || quote_ident(stmt.tablename) || ' CASCADE ;';
    end loop;
end;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR: syntax at or near "$1"    LINE1:   $1
QUERY $1
CONTEXT: SQL statement in PL/PgSQL function "truncate_tables" near line 5
Run Code Online (Sandbox Code Playgroud)

我是 Postgres …

postgresql dynamic-sql cursors plpgsql postgresql-8.3

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

如何从游标中获取到表变量?

我有一个游标定义为:

DECLARE idCursor CURSOR         
    FOR SELECT DISTINCT [id], [data]
        FROM #tempTable  
Run Code Online (Sandbox Code Playgroud)

我有一个变量定义为:

DECLARE @currentId TABLE (
                            [id] int,
                            [data] char(1)
                         );  
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将下一个结果提取到 @currentId

FETCH NEXT FROM idCursor INTO @currentId  
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Must declare the scalar variable "@currentId".  
Run Code Online (Sandbox Code Playgroud)

如何在表中获取游标获取的结果?我知道我可以声明两个变量并单独存储结果。但是对于包含许多列的表来说,这将是耗时的。

t-sql sql-server-2008-r2 cursors

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

@@FETCH_STATUS 是否有(或需要)相当于 SCOPE_IDENTITY 的?

MSDN 建议@@FETCH_STATUS谨慎使用,因为它是全球性的

因为@@FETCH_STATUS 对连接上的所有游标都是全局的,所以请谨慎使用@@FETCH_STATUS。执行 FETCH 语句后,必须在针对另一个游标执行任何其他 FETCH 语句之前对 @@FETCH_STATUS 进行测试。

这让我想到两个问题:

  1. 另一个(非嵌套)游标是否有可能与我的游标同时运行并影响@@FETCH_STATUSmyFETCH NEXTWHILEcondition之间的值?例如,假设另一个游标位于按计划调用的存储过程中。
  2. 如果这是可能的,是否@@FETCH_STATUS有等价于@@IDENTITY's SCOPE_IDENTITY()

sql-server sql-server-2008-r2 cursors

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

根据其他两列添加 ID 列

我有一个查询,它返回如下输出:

 [Location] [Reference] [Year] [Int1] [Int2]
    England           1   2015     13    201
    England           1   2015     12     57
    England           1   2015      4     14
    England           2   2015     18     29
    England           2   2015     18     29
    England           1   2016     32     67
    England           1   2016     43     11
    England           2   2016     10     56
Run Code Online (Sandbox Code Playgroud)

其中 int1 和 int2 列表示有关位置的一些计算数据。我试图在报告中表示数据并意识到我可以使用表单的 ID 列:

 [ID][Location] [Reference] [Year] [Int1] [Int2]
    1   England           1   2015     13    201
    2   England           1   2015     12     57
    3   England           1   2015      4     14
    1   England           2   2015 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 cursors rank

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

PostgreSQL 游标是否绑定到连接?

我想用 PostgreSQL 游标确认一点。

我必须为巨大的结果集查询(超过 1Go 的小重量行)实现一个选择工厂。因此,我已经了解了游标,并按以下方式执行查询:

我创建一个光标:

DECLARE HashedCursorName CURSOR FOR SELECT * FROM BigResultSetQuery;
Run Code Online (Sandbox Code Playgroud)

我重复获取少量结果集:

FETCH 1000 FROM HashedCursorName;
Run Code Online (Sandbox Code Playgroud)

当结果集耗尽时,我关闭游标:

CLOSE HashedCursorName;
Run Code Online (Sandbox Code Playgroud)

我需要解决并发问题,我的意思是,许多用户必须能够同时使用 API 过程中存储的相同查询。当用户执行存储的查询时,他会收到一个新连接。我首先在 API 中修改了我的游标名称,因为我认为如果调用所有选择查询,StaticCursorName我会遇到两个用户试图创建相同游标或读取相同游标的问题。一切都按预期进行。

然后我尝试将光标名称更改为静态名称,它仍然有效。我能够同时运行多个相同的查询。然后我想知道,光标是否绑定到连接?,然后PostgreSQL是通过将游标分配给会话来解决并发的吗?

postgresql concurrency cursors

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

基于一行返回一批行

假设我在 SQL Server 2008 中有一个这样的表:

id  |  name  |  qty
-------------------
1   |  john  |    1
2   |  bill  |    3
3   |  mary  |    2
4   |  jill  |    5
Run Code Online (Sandbox Code Playgroud)

我想查询此表并为每批返回 1 行,最多为 2。因此,查询结果如下所示:

id  |  name  |  qty
-------------------
1   |  john  |    1
2   |  bill  |    2
2   |  bill  |    1
3   |  mary  |    2
4   |  jill  |    2
4   |  jill  |    2
4   |  jill  |    1
Run Code Online (Sandbox Code Playgroud)

这可以在不使用光标的情况下整齐地完成吗?这可以使用 unpivot 吗?

顺便说一下,该 …

sql-server-2008 cursors cross-apply unpivot

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

光标导致 SSMS 崩溃

我有一个游标,它从一组表中生成一条 JSON 文本记录。光标一直在使 SSMS 崩溃。该脚本运行了一段时间,然后 SSMS 失败。下面是我编写的导致崩溃的代码。

DECLARE @ROW_ID int  -- Here we create a variable that will contain the ID of each row.

DECLARE JSON_CURSOR CURSOR   -- Here we prepare the cursor and give the select statement to iterate through
FOR

        SELECT  -- Our select statement (here you can do whatever work you wish)
            ROW_NUMBER() OVER (ORDER BY NAME_2-1,NAME_2-2,FIELD_1-1,FIELD_1-2) AS ROWID
        FROM
            (
            SELECT 
                FIELD_1-1
                ,FIELD_1-2
                ,NAME_1-1
                ,NAME_1-2
            FROM 
                (
                SELECT FIELD_1-1,FIELD_1-2,NAME,VALUE
                FROM TABLE_1
                WHERE NAME IN ('NAME_1-1','NAME_1-2')
                ) …
Run Code Online (Sandbox Code Playgroud)

sql-server ssms cursors json

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