Разработчик SQL (и SQL * Plus, но, возможно, не другие клиенты!) Нуждается в exec
команда должна находиться на одной линии. Вы не показали более ранние ошибки вы бы получили от этого вызова:
EXEC secure_update
Error report -
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SECURE_UPDATE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Error starting at line : 25 in command -
('
UPDATE dummy_table
SET col1 = ''whatever''
WHERE pk = ''1234''
')
Error at Command Line : 25 Column : 2
Error report -
SQL Error: Invalid SQL type: sqlKind = UNINITIALIZED
Процедура вызывается без аргументов, потому что нет ни на одной и той же линии, что и фактическое exec
, так что вы получите PLS -00306 от этой линии. Затем остаток интерпретируется как отдельная команда, которая получает сообщение об ошибке «недопустимый тип SQL». (В SQL Developer, то есть в SQL * Plus вы получите тот же PLS-00306 для первой части, но ORA-00928: missing SELECT keyword
для остальных).
Вы можете либо переместить все заявление в одну строку:
EXEC secure_update ('UPDATE dummy_table SET col1 = ''whatever'' WHERE pk = ''1234''');
Или использовать явный анонимный блок, а не exec
стенографии:
BEGIN
secure_update
('UPDATE dummy_table
SET col1 = ''whatever''
WHERE pk = ''1234''
');
dbms_output.put_line('after');
END;
/
Заметим также, что я должен был двигаться UPDATE
в любом случае, так как ваш чек не допускает пробелов (включая разрыв строки) в начале команды. into msg
в вашей процедуре ничего не делает, но, похоже, не вызывает проблемы; если вы хотите увидеть, сколько строк было обновлено, используйте SQL% ROWCOUNT после execute immediate
.
при использовании 'dynamic sql', попытайтесь поместить значения varchar внутри двух двух кавычек' ''whatever''', я имею в виду использование' '' '' '' – jfun
Помимо ошибки, которую вы видите, несбалансированный одинарные кавычки и что 'exec' должен быть на одной строке, я не уверен в вашей цели. Если вы хотите проверить предложение 'where', чтобы вызывающий абонент не смог сразу обновить все записи, что мешает им делать что-то вроде' where 1 = 1'? –
Этот plsql предназначен для экспериментов. Я не рассматриваю безопасность на данный момент – user311509