Хранимая процедура Oracle не работает (где в строке) - PullRequest
1 голос
/ 31 марта 2011

Вот вся моя хранимая процедура:

CREATE OR REPLACE PROCEDURE "CTI"."TEMP_DIVISION"
(
    pDivisionList in varchar2,
    out_cursor out SYS_REFCURSOR
)
as
begin
  open out_cursor for
  SELECT distinct CTA_DIVISION
  FROM cti_account 
  WHERE CTA_DIVISION in (pDivisionList);  
END;

Если я передаю TPA, он возвращает TPA в виде 1 строки (правильно). Если я передаю CFL, он возвращает CFL в виде 1 строки (правильно). Однако то, что я хотел бы сделать, это передать TPA, CFL и запустить его как WHERE CTA_DIVISION в ('TPA', 'CFL'), возвращая 2 строки данных, но этого не происходит. Это не возвращает никаких строк. Что мне нужно изменить, чтобы иметь возможность передавать эту строку и возвращать 2 строки? ТИА

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

Я думаю, что вы можете адаптировать Oracle: передавая список как переменную связывания для вашего случая.

Чтобы varchar2 работал как список или одно значение, вам нужно проанализировать pDivisionList в массив (возможно, одного значения) и передать его другой процедуре (которая может быть определена в вашей процедуре. )

WRT к решению @frustratedwithformsdesigner, динамический sql подвержен sql-инъекции. Будьте осторожны с такими решениями.

0 голосов
/ 01 апреля 2011

Более простой способ:

SELECT distinct CTA_DIVISION
FROM cti_account 
WHERE INSTR(','||pDivisionList||',', ','||CTA_DIVISION||',') > 0;
0 голосов
/ 31 марта 2011

Это, вероятно, можно сделать с помощью динамического SQL. Создайте запрос так:

sql_str := 'SELECT distinct CTA_DIVISION
  FROM cti_account 
  WHERE CTA_DIVISION in ('||pDivisionList||')'; 

и затем используйте execute immediate. Конечно, вам нужно убедиться, что pDivisionList отформатирован как "'a','b','c'".

Конечно, динамический SQL имеет потенциальные проблемы с внедрением SQL, поэтому убедитесь, что у вас есть полный контроль над тем, что попадает в pDivisionList.

...