【问题标题】:Escaping single quote in PLSQL在 PLSQL 中转义单引号
【发布时间】:2011-10-04 10:37:26
【问题描述】:

我希望 PLSQL 生成如下字符串:

COMMENT ON COLUMN TABLE.COLUMN IS 'comment from database';

我的解决办法是:

declare
  str_comment varchar2(4000);
begin
  for rec in (select table_name, column_name, description from description_table)
  loop
    str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name||'  IS '''||rec.description||'''; ' ;
    dbms_output.put_line(str_comment);
  end loop;
end;

rec.description 中不包含单个 qoutes 时,输出正常。否则需要转义信。我应该如何实现它?

OK 输出行(它有转义字母来保存单个 qoute):

COMMENT ON COLUMN TABLE1.COLUMN1_LV  IS 'It''s secret';

NOT NOK 输出行,因为没有添加单引号的转义字母并且无法编译:

COMMENT ON COLUMN TABLE1.COLUMN1_LV  IS 'It's secret';

我的解决方案是不检查描述是否包含单引号。我只是在生成COMMENT ON 字符串之前将源(描述)列的单引号替换为两个单引号,然后再生成ROLLBACK

有更好的解决方案吗?

【问题讨论】:

  • 用双引号代替单引号就可以了。 ROLLBACK 有什么意义?您能否发布整个代码(带有替换和回滚)?
  • @Quassnoi 他可能会更新 description_table,然后回滚更新

标签: oracle plsql


【解决方案1】:

你需要在代码中使用'' 但在尝试实际代码之前,

试试在双引号中有引号的那一行

例如:

select '''sumesh''' from dual

【讨论】:

  • 我看不出这个答案与接受的答案有何不同。
【解决方案2】:

您可以像

一样使用 Quote 运算符
str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name||' IS q''[' ||rec.description|| ']'';' ;

http://psoug.org/reference/string_func.html

【讨论】:

  • 如果描述本身包含]',这将不起作用。
  • 但您可以使用其他字符代替 [ 和 ]。事实上,除了空格、RETURN 或制表符之外的任何内容。
  • @mik 我知道这是一个旧评论,但为了任何重定向到这个答案的人的利益,引用的字符串包含引号字符是完全可以的。例如,以下工作非常好,至少在 11.2.0.4 中:SELECT q'{{test}{from}}' FROM dual; 这返回:{test}{from}
  • @Boneist,但是,正如我所写,它不能包含 }'(引号字符后跟撇号)
  • @mik 啊,好点。显然我需要一个新的视力测试,因为我不知何故没有看到 '... d'oh!
【解决方案3】:

在您的选择中使用REPLACE 函数。

declare
str_comment varchar2(4000);
begin
for rec in (SELECT table_name, column_name, REPLACE(description, '''', '''''') 
                FROM description_table)
loop
str_comment:='COMMENT ON COLUMN ' || rec.table_name || '.' 
                 ||rec.column_name|| ' IS ''' ||rec.description|| '''; ' ;
dbms_output.put_line(str_comment);
end loop;
end;

【讨论】:

  • 这将给出PLS-00302: component 'DESCRIPTION' must be declared,因为rec 中没有description 字段。您应该在REPLACE() 之后添加列别名,或者将REPLACE 放在str_comment 语句的赋值中。
【解决方案4】:

我经常做这种事情(通常会生成插入/更新语句)。

您只需使用替换功能将所有' 变成''。即更改为:

str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name
            ||' IS '''||REPLACE( rec.description,'''','''''')||'''; ' ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多