'на процедуру / функцию - PullRequest
1 голос
/ 09 апреля 2019

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

'||valor||' 

, но в функции, я не знаю, почему мне нужно было написать

return 'UPPER(USER_NAME) = ''' || user || '''';

не только '|| пользователь ||'.Кто-нибудь может мне помочь?

Ответы [ 3 ]

3 голосов
/ 09 апреля 2019

Не конструируйте ваш запрос с объединенными значениями.

Вместо этого используйте что-то подобное

EXECUTE IMMEDIATE 'SELECT user_id FROM user_table WHERE UPPER( username ) = :1' INTO your_user_id USING UPPER( your_user_name );

Он будет обрабатывать все случаи.В вашем примере, что произойдет, если user содержит '?Что делать, если у вас есть 2 последовательных '?Это может быть настоящим кошмаром.

Вот несколько примеров из Oracle

1 голос
/ 10 апреля 2019

здесь все, что входит в две одинарные кавычки ('), будет считаться строкой. но что, если вам нужна строка с одинарными кавычками внутри себя. пример, если вам нужна переменная word-sample для переменной, ее можно просто объявить как l_var: = 'sample'. но если строка нужна с одинарными кавычками вроде - «Это образец» ?? в этом случае, если мы позволим, как есть, механизм sql будет читать от первой одинарной кавычки до следующей одинарной кавычки, аналогично ... в этом случае мы будем использовать одинарные кавычки несколько раз, как требуется.

это может быть указано ниже пример:

declare
single_quote_string varchar2(20):= 'sample';
multi_quote_string varchar2(20):= 'It''s sample';
multi_quote2_string varchar2(20):= '''It''s sample''';
begin
dbms_output.put_line('single_quote_string:'||single_quote_string);
dbms_output.put_line('multi_quote_string:'||multi_quote_string);
dbms_output.put_line('multi_quote2_string:'||multi_quote2_string);
end;

--output
single_quote_string:sample
multi_quote_string:It's sample
multi_quote2_string:'It's sample'

в вашем вопросе вы спрашивали об использовании: return 'UPPER (USER_NAME) =' '' || пользователь || '' ''; в немедленном исполнении.

execute немедленный - используется для выполнения строки. в вашем случае это условие where имени пользователя.

при нормальном sql у нас будет

upper(username) = 'SAMPLE';

но здесь это условие должно быть передано в виде строки для выполнения немедленной команды, то есть обычные кавычки, которые мы обычно используем, должны быть переданы в виде строки, и, следовательно, мы используем несколько раз.

если все еще не ясно, вы можете попытаться отобразить оператор немедленного выполнения, который вы используете в своем коде, который выведет команду sql, которую вы пытаетесь запустить, в команду немедленного выполнения.

1 голос
/ 09 апреля 2019

user - это строка в SQL, и она должна быть заключена в SQL-запрос: ваш последний запрос, за исключением экранирования, должен читать UPPER(USER_NAME) = 'user', а не UPPER(USER_NAME) = user.

Но весь фрагмент запроса является строкой в ​​PL / SQL, поэтому вы должны поместить строку в строку.Чтобы получить кавычки для строки SQL в строке PL / SQL, вам нужно удвоить их, чтобы «избежать», поэтому Oracle не считает, что сама строка PL / SQL заканчивается.

Поэтому, когда вы пишете '''', внешняя кавычка определяет границы самой строки (PL / SQL), а внутренние две кавычки представляют собой одну экранированную кавычку внутри этой строки.

В любом случае, хотя это может быть реальным ответом на ваш вопрос и определенно полезно, если вам нужен пустой набор кавычек или фиксированная строка в вашем запросе, в целом, лучше использовать параметризованные запросы, поэтому я призываю вас следовать за ЛюкомПример М.

...