暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将参数传递给bulk collect语句中的where子句

ASKTOM 2019-05-02
395

问题描述

嗨,我有一个基本过程,批量将select语句的结果收集到表数组中。然后,我打印出一行以表明它起作用了。

代码 (SQL):
CREATE OR REPLACE PROCEDURE use_var
IS
TYPE r_tab IS TABLE OF msf010%rowtype;
rr_tab r_tab;
BEGIN

SELECT msf010.* bulk collect INTO
rr_tab
FROM msf010 WHERE table_type='E6' ;

DBMS_OUTPUT.PUT_LINE(RR_TAB(1).TABLE_CODE);
END;

该过程工作正常,但我希望能够将参数传递给该过程,该过程将构成where子句的一部分,如下所示。

代码 (SQL):
CREATE OR REPLACE PROCEDURE use_var2 (rob_var2 IN varchar2)
IS
TYPE r_tab IS TABLE OF msf010%rowtype;
rr_tab r_tab;
BEGIN

SELECT msf010.* bulk collect INTO
rr_tab
FROM msf010 WHERE table_type=rob_var2 ;

DBMS_OUTPUT.PUT_LINE(RR_TAB(1).TABLE_CODE);
END;

EXEC use_var2('E6')

产生以下错误输出 ..

命令中从第14行开始出现错误:
执行使用 _ var2 ('e6')
错误报告:
ORA-06533: 下标超出计数
ORA-06512: 在 “RREES4.USE _ VAR2”,第11行
ORA-06512: 在第1行
06533. 00000 - "Subscript beyond count"
* 原因: 限制内下标大于varray的计数
或者对于嵌套表来说太大。
* 操作: 检查程序逻辑,并在必要时显式扩展。

当我在工作中执行此过程时,它会抛出如上所示的错误,但在实时sql链接中它的工作原理。我为live sql工作表区域创建的表中只有4行。因此,它与原始表中的太多行有关。对于表类型 = 'e6',大约有13行,但整个表将有超过100,000行。

我还应该使用动态sql传递参数吗?


谢谢,

PS-请告知我是否正确设置了实时sql链接供您查看。第一次使用它。抱歉,无法提供实时sql链接,因为它仍在审查中。一旦批准,将提供。

罗伯。

专家解答

据推测,您的查询不返回任何行。所以数组中没有元素1:

declare
  type tp is table of dual%rowtype;
  vals tp;
begin
  select dummy
  bulk   collect 
  into   vals
  from   dual 
  where  1 = 0;
  
  dbms_output.put_line ( 'Found ' || vals.count || ' rows' );
  dbms_output.put_line ( vals(1).dummy );
end;
/

Found 0 rows
ORA-06533: Subscript beyond count


Also should i be using dynamic sql to pass the parameter?

不!

您已经正确编写了查询。只是dbms_output引用RR_TAB(1)。TABLE_CODE这就是问题所在。

在执行此操作之前,请验证查询是否获取了某些内容:

declare
  type tp is table of dual%rowtype;
  vals tp;
begin
  select dummy
  bulk   collect 
  into   vals
  from   dual 
  where  1 = 0;
  
  if vals.count > 0 then 
    dbms_output.put_line ( vals(1).dummy );
  else
    dbms_output.put_line ( 'Got nothing' );
  end if;
end;
/

Got nothing


在LiveSQL上-您将其保存为 “未列出” 链接。您仍然可以与我们共享此类脚本的链接。无需批准。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论