带有新类型参数的 Oracle 过程给出 ORA-00947 错误

Oracle procedure with new type parameter giving ORA-00947 Error

我正在处理一个接受大量输入然后返回填充游标的过程。该过程将从 Java 应用程序中调用。是的,这很容易构建为临时查询,但我试图在我的代码中只使用正确的函数/过程调用。

我将传入未知数量的参数。我用这个建议一种新类型的答案解决了这个问题。

但是现在我收到"PL/SQL: ORA-00947: no enough values"错误,我无法找出问题所在。我知道它与 where 子句子查询有关。

1
2
3
4
5
6
7
DESC BILINGUAL
Name        Null     Type          
----------- -------- -------------
KEYFIELD    NOT NULL VARCHAR2(16)  
PURPOSE              VARCHAR2(128)
CONTENTS_EN NOT NULL VARCHAR2(128)
CONTENTS_FR NOT NULL VARCHAR2(128)

这是一个如何使用和工作的示例。

1
2
3
 select keyfield, contents_en, contents_fr
 from bilingual
 where keyfield in ('1111', '1111A');

这是我正在编写的程序。

1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE TYPE STRING_TABLE AS TABLE OF VARCHAR2(16);

CREATE OR REPLACE PROCEDURE DOCSADM.BILINGUAL_VALUES (
IN_KEYS string_table,
CUR OUT SYS_REFCURSOR) AS
BEGIN
    SELECT KEYFIELD, CONTENTS_EN, CONTENTS_FR
    INTO CUR
    FROM BILINGUAL
    WHERE KEYFIELD IN (SELECT column_value FROM TABLE(IN_KEYS));
END BILINGUAL_VALUES;

一般来说,在 PL/SQL 中,您会使用 OPEN .. FOR SELECT .. 语法而不是 SELECT .. INTO 打开一个引用游标(尽管 SQL 中对 CURSOR () 函数的支持意味着您在技术上都可以做到),例如

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE PROCEDURE docsadm.bilingual_values (
   in_keys string_table,
   cur OUT SYS_REFCURSOR)
AS
BEGIN
   OPEN cur FOR
      SELECT keyfield,
             contents_en,
             contents_fr
      FROM   bilingual
      WHERE  keyfield IN (SELECT COLUMN_VALUE FROM TABLE (in_keys));
END bilingual_values;
/