如何将子句中的数组传递给 plsql 过程 - Oracle

问题描述 投票:0回答:2

我正在与 SQL 开发人员一起玩,在这里遇到了一个问题...我想传递一个 ID 数组并选择这些 ID 指向的所有行。

要传递数组并在 Oracle 中带有

SELECT
子句的
IN
语句中使用它,我遵循了以下步骤:

  1. 在 Oracle 中为数组数据类型创建自定义类型。
create or replace TYPE "NBR_ARRAY" as table of varchar2(30);

使用以下过程将数组作为参数传递。

DECLARE
    MID    varchar2(1000);
BEGIN
    I_ACCOUNT_NUM := ORADBA.CUST_ACCT_NBR_ARRAY(123); -- Initialize the PL/SQL table with values
            
     SELECT id into MID
     FROM ac WHERE  ID ='56' and nbr IN (SELECT COLUMN_VALUE FROM TABLE(NBR_ARRAY('123')));
        
     DBMS_OUTPUT.PUT_LINE('MID::'||MID);
END;

我看到结果集为

Error report:
ORA-01403: no data found
ORA-06512: at line 10
01403. 00000 -  "no data found"

当我运行以下查询本身时,我有一条记录。

select ID from  ORADBA.AC where ID ='56' and NBR='123'; -- able to see 56 in resultset
oracle plsql
2个回答
0
投票

鉴于设置:

CREATE TYPE NBR_ARRAY as table of varchar2(30);

CREATE TABLE ac (id, nbr) AS
SELECT '56', '123' FROM DUAL;

然后你可以使用:

DECLARE
  mid           VARCHAR2(1000);
  I_ACCOUNT_NUM NBR_ARRAY;
BEGIN
  I_ACCOUNT_NUM := NBR_ARRAY(123); -- Initialize the PL/SQL array with values
        
  SELECT id
  into   MID
  FROM   ac
  WHERE  ID ='56'
  AND    nbr IN (SELECT COLUMN_VALUE FROM TABLE(i_account_num));
    
  DBMS_OUTPUT.PUT_LINE('MID::'||MID);
END;
/

哪个输出:

MID::56

或者更简单地说:

SELECT id
FROM   ac
WHERE  ID ='56'
AND    nbr MEMBER OF NBR_ARRAY(123);

哪个输出:

身份证
56

小提琴


0
投票

为什么当我使用以逗号分隔的字符串引用值时我没有得到它

声明 中 VARCHAR2(1000); I_ACCOUNT_NUM NBR_ARRAY; 逗号分隔字符串 VARCHAR2(200):=''; 开始 I_ACCOUNT_NUM := NBR_ARRAY(123); -- 用值初始化 PL/SQL 数组

FOR i IN 1..I_ACCOUNT_NUM.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE('Element ' || i || ': ' || I_ACCOUNT_NUM(i));
    IF i = 1 THEN
        comma_separated_string := comma_separated_string || '''' || I_ACCOUNT_NUM(i) || '''';
    ELSE
        comma_separated_string := comma_separated_string || ',' || '''' || I_ACCOUNT_NUM(i) || '''';
    END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('comma_separated_string ' ||comma_separated_string);

 SELECT id

进入MID 来自交流 其中ID='56' AND nbr IN(逗号分隔字符串);

DBMS_OUTPUT.PUT_LINE('MID::'||MID); 结尾; /

© www.soinside.com 2019 - 2024. All rights reserved.