'关于程序/功能

时间:2019-04-09 19:34:32

标签: sql plsql oracle-sqldeveloper

我不知道何时放'。 例如在过程中,当我写时立即执行“句子” 如果我的句子中有一个值

'||valor||' 

但是在功能上,我不知道为什么我必须写

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

不仅是“ ||用户||”。 有人可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

不要用串联值构造查询。

改用类似的方法

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

它将处理所有情况。在您的示例中,如果user包含'会发生什么?如果您连续有2个'怎么办?这可能是一场真正的噩梦。

Here's some examples from Oracle

答案 1 :(得分:1)

user是SQL中的字符串,并且应在SQL查询中用引号引起来:您的最终查询(除转义符外)应读取UPPER(USER_NAME) = 'user',而不是UPPER(USER_NAME) = user

但是整个查询片段都是PL / SQL中的字符串,因此您必须将字符串放入字符串中。要获得PL / SQL字符串中SQL字符串的引号,您需要将它们加倍以“转义”它们,因此Oracle认为PL / SQL字符串本身不会结束。

因此,当您编写''''时,外部引号定义(PL / SQL)字符串本身的边界,内部两个引号是该字符串内部的单个转义引号。

尽管如此,虽然这可能是您问题的实际答案,并且如果您需要在查询中使用空的引号集或固定的字符串绝对有帮助,但是通常最好使用参数化查询,因此,我建议您跟随卢克·M(Luc M)的例子。

答案 2 :(得分:1)

在这里,两个单引号(')中的所有内容都将被视为字符串。但是如果您需要一个在其内部带有单引号的字符串该怎么办。 例, 如果您需要一个单词(样本)作为变量,则可以简单地将其声明为l_var:='sample'。 但是如果需要用单引号将字符串括起来,例如-'It's 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立即执行用于执行字符串。 在您的情况下,这是用户名的条件。

当拥有普通的sql时,我们将拥有

upper(username) = 'SAMPLE';

但是这里必须将此条件作为字符串传递才能执行立即命令,这意味着我们通常使用的单引号必须作为字符串传递,因此我们要使用多次。

如果仍然不清楚,则可以尝试显示在代码中使用的execute立即执行语句,这将输出您试图在execute Instant命令中运行的sql命令。