gpt4 book ai didi

oracle - 如何从执行动态 SQL 的 Oracle PL/SQL 匿名 block 返回结果集/游标?

转载 作者:行者123 更新时间:2023-12-02 07:07:19 25 4
gpt4 key购买 nike

我有这张表:

ALLITEMS
---------------
ItemId | Areas
---------------
1 | EAST
2 | EAST
3 | SOUTH
4 | WEST

DDL:

drop table allitems;

Create Table Allitems(ItemId Int,areas Varchar2(20));
Insert Into Allitems(Itemid,Areas) Values(1,'east');
Insert Into Allitems(ItemId,areas) Values(2,'east');
insert into allitems(ItemId,areas) values(3,'south');
insert into allitems(ItemId,areas) values(4,'east');

在 MSSQL 中,要从动态 SQL 中获取游标,我可以这样做:

DECLARE @v_sqlStatement VARCHAR(2000);
SET @v_Sqlstatement = 'SELECT * FROM ALLITEMS';
EXEC (@v_sqlStatement); --returns a resultset/cursor, just like calling SELECT

在 Oracle 中,我需要使用 PL/SQL block :

SET AUTOPRINT ON;
DECLARE
V_Sqlstatement Varchar2(2000);
outputData SYS_REFCURSOR;
BEGIN
V_Sqlstatement := 'SELECT * FROM ALLITEMS';
OPEN outputData for v_Sqlstatement;
End;
--result is : anonymous block completed

**但我得到的只是

anonymous block completed".

如何让它返回光标?

(我知道如果我执行 AUTOPRINT,它会打印出 REFCURSOR 中的信息(上面的代码中没有打印,但那是另一个问题))

我将从代码(ODBC、C++)调用此动态 SQL,并且我需要它返回游标。怎么办?

最佳答案

您可以编写一个 PL/SQL 函数来返回该游标(或者,如果您有更多与此相关的代码,您可以将该函数放入一个包中):

CREATE OR REPLACE FUNCTION get_allitems
RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR SELECT * FROM allitems;
RETURN my_cursor;
END get_allitems;

这将返回光标。

尽可能确保不要将 SELECT-String 放入 PL/SQL 中的引号中。把它放在字符串中意味着它不能在编译时检查,并且无论何时使用它都必须对其进行解析。

<小时/>

如果您确实需要使用动态 SQL,您可以将查询放在单引号中:

  OPEN my_cursor FOR 'SELECT * FROM allitems';

每当调用函数时都必须解析该字符串,这通常会比较慢,并且会在运行时之前隐藏查询中的错误。

确保尽可能使用绑定(bind)变量以避免 hard parses :

  OPEN my_cursor FOR 'SELECT * FROM allitems WHERE id = :id' USING my_id;

关于oracle - 如何从执行动态 SQL 的 Oracle PL/SQL 匿名 block 返回结果集/游标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2153053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com