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



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

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

然而,现在我得到了"PL/SQL:ORA-00947:值不够"的错误,我无法解决这个问题。我知道它与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;

一般来说,在PL/SQL中,您会用open打开ref游标。。选择。。语法而不是SELECT。。INTO(尽管SQL中对CURSOR()函数的支持意味着从技术上讲你可以做任何一个),例如

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

最新更新