Процедура Oracle с параметром нового типа, выдающим ошибку ORA-00947 - PullRequest
0 голосов
/ 28 января 2019

Я работаю над процедурой, которая принимает большое количество входных данных, а затем возвращает заполненный курсор.Процедура будет вызываться из приложения 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;

1 Ответ

0 голосов
/ 28 января 2019

Вообще говоря, в PL / SQL вы бы открывали курсор ref с синтаксисом OPEN .. FOR SELECT .., а не SELECT .. INTO (хотя поддержка функций CURSOR () в SQL означает, что вы могли бы сделать это технически либо), например,

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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...