Concat CLOB в PL / SQL для немедленного выполнения - PullRequest
1 голос
/ 10 декабря 2010

Мне нужно изменить сигнатуру функции, чтобы иметь параметр (p_param) типа CLOB, предыдущий тип был nvarchar2.Это вызвало у меня проблемы, когда существующий код использовал ||к конкатате.

Вот существующий фрагмент, который отлично работал для NVarchar2, но, очевидно, при использовании ||чтобы объединить CLOB, он обрабатывает его как nvarchar2, что является проблемой при превышении предельного числа символов nvarchar2.

 execute immediate    
    'select p.person_id 
     from person p where p.id in (' || p_param || ')'
 bulk collect into persons;

Я попытался изменить приведенный выше фрагмент на

  execute immediate   
   concat(concat('select p.id from person p where p.person_id in(',p_param),')')
  bulk collect into members;

Это не компилируется, я получаю сообщение об ошибке

PLS-00382: выражение имеет неправильный тип

Я новичок в PL / SQL, спасибо запомощь.

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010

Поскольку вам нужно изменить этот конкретный фрагмент кода для использования DBMS_SQL, я настоятельно рекомендую изменить его, чтобы полностью исключить подход динамического SQL. Вместо этого я взял бы функцию Тома str2tbl , изменил ее на CLOB (последующий ответ уже сделал это ), а затем изменил код на

select p.person_id 
  bulk collect into persons
  from person p 
 where p.id in (select column_value
                  from str2tbl( p_param ))

Как минимум, это позволит вам избежать создания большого количества неразборчивых операторов, сократить количество сложных разборов и время, затрачиваемое на синтаксический анализ, а также уменьшить нагрузку на общий пул. Это также может снизить риск таких вещей, как атаки с использованием SQL-инъекций.

1 голос
/ 10 декабря 2010

Нельзя использовать CLOB для немедленного выполнения до 11g. До этого вам нужно будет переключиться на DBMS_SQL.

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7032414607769#2445120800346017454

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...