oracle之如何存储和填充 Oracle 中 Execute Immediate 返回的数据
linjiqin
阅读:17
2025-02-15 21:57:57
评论:0
在我的项目中,我正在尝试执行以下查询:
DECLARE
Sid nvarchar2(30) := ''; /*Here the values will come from some other variable>*/
Bid nvarchar2(30) := ''; /*Here the values will come from some other variable>*/
ExecuteDSQL varchar2(1000);
ExecuteDSQLResult varchar2(10000);
BEGIN
IF Sid IS NULL THEN Sid := '1' ; ELSE Sid := '4' ; END IF;
IF Bid IS NULL THEN Bid := '1' ; ELSE Bid := '5' ; END IF;
ExecuteDSQL := ' SELECT * FROM iftlog WHERE serverid='''|| Sid
|| ''' AND bpid=''' || Bid || ''' ';
EXECUTE IMMEDIATE ExecuteDSQL INTO ExecuteDSQLResult;
DBMS_OUTPUT.PUT_LINE(ExecuteDSQLResult);
END;
/
查询导致数据类型不一致的错误,除了这个错误之外,问题是我们可以像在 MS-SQL 中那样将结果存储到临时表中吗?我是 oracle 数据库的新手。我需要临时表来存储 1 到 20 之间的记录,我将使用 Row_Number() 并将在我的项目中相应地修改查询。
请您参考如下方法:
SQL Server 临时表的 Oracle 等价物是一个 PL/SQL 集合。我们可以使用 %rowtype
语法来定义匹配表投影的本地类型。我们可以使用该类型将局部变量声明为选择的目标。
可惜没有打印记录的便捷机制:您需要在 DBMS_OUTPUT.PUT_LINE() 调用中指定每个单独的列。
这是您用 idomatic PL/SQL 重写的代码:
DECLARE
Sid nvarchar2(30) := '';/*Here the values will come from some other variable>*/
Bid nvarchar2(30) := '';/*Here the values will come from some other variable>*/
ExecuteDSQL varchar2(1000) := 'SELECT * FROM iftlog WHERE serverid= :1 AND bpid= :2';
type iftlog_nt is table of iftlog%rowtype;
ExecuteDSQLResult iftlog_nt;
BEGIN
IF Sid IS NULL THEN Sid := '1' ; ELSE Sid := '4' ; END IF;
IF Bid IS NULL THEN Bid := '1' ; ELSE Bid := '5' ; END IF;
EXECUTE IMMEDIATE ExecuteDSQL
bulk collect into ExecuteDSQLResult
using sid and bid;
-- loop through all records in PL/SQL table
for idx in 1..ExecuteDSQLResult.count()
loop
DBMS_OUTPUT.PUT_LINE(ExecuteDSQLResult(idx).some_col||'::'||ExecuteDSQLResult(idx).some_other_col);
end loop;
END;
/
当然,让它像这样重写代码就很明显根本不需要动态 SQL。所以我们可以用直接的选择替换 EXECUTE IMMEDIATE 调用:
SELECT *
bulk collect into ExecuteDSQLResult
FROM iftlog
WHERE serverid= sid
AND bpid= bid;
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。