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; 


标签:oracle
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号