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