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

时间:2019-01-28 20:34:43

标签: oracle stored-procedures

我正在研究一个过程,该过程接受大量输入,然后返回填充的游标。该过程将从Java应用程序中调用。是的,将其作为即席查询很容易构建,但是我试图在代码中仅使用适当的函数/过程调用。

我将传递未知数量的参数。我用this answer解决了这个问题,提出了一种新类型。

但是,现在我收到“ PL/SQL: ORA-00947: not enough values”错误,并且无法弄清问题所在。我知道它与where子句查询有关。

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) 

这是如何使用它以及如何工作的示例。

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

这是我正在编写的过程。

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;

1 个答案:

答案 0 :(得分:2)

通常来说,在PL / SQL中,您将使用OPEN .. FOR SELECT ..语法而不是SELECT .. INTO打开ref游标(尽管SQL中对CURSOR()函数的支持意味着您可以从技术上做到任何一种),例如< / p>

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;
/