【问题标题】:How to deal with the single quote in pl/sql code如何处理pl/sql代码中的单引号
【发布时间】:2014-03-25 09:50:49
【问题描述】:

执行以下代码时遇到以下错误。 错误报告: ORA-01722: 无效号码 ORA-06512: 在第 12 行 01722. 00000 - “无效号码”

你能帮我找出根本原因吗?

declare
v_str varchar2(100):='XY';
v_cnt number := 1;
v_text varchar2(100);
v_sysdate date := sysdate;
begin
v_text := 'select to_char(' || '''' || v_sysdate || '''' || ',''yyyy/mm/dd'') from dual';
dbms_output.put_line(v_text);
execute immediate v_text into v_str;
dbms_output.put_line(v_str);
end;

【问题讨论】:

  • 这种情况下真的需要动态SQL吗?

标签: oracle


【解决方案1】:

问题是您试图将 char 转换为 char,就好像第一个是日期一样。请注意,您正在执行以下查询:

select to_char('2014-03-14','yyyy/mm/dd') from dual

这没有任何意义。 “日期”(2014-03-14)实际上是一个字符串,你不能把它当作一个日期来对待。

如果您只想将 v_sysdate 转换为 varchar2,您可以这样做:

v_str := to_char(v_sysdate,'yyyy/mm/dd');

或者您可能只是在研究动态 SQL 的工作原理...

【讨论】:

  • V_SYSDATE 是一个日期变量,当您将 V_SYSDATE 连接到查询字符串时,您会隐式地将 V_SYSDATE 转换为字符串。执行查询时,PL/SQL 实际执行的是 SELECT TO_CHAR('2014-03-14','YYYY/MM/DD') FROM DUAL,即它试图将 V_SYSDATE 转换为字符串,但它有已经转换成字符串了。
【解决方案2】:

请大家在回答之前测试一下...立即执行的问题..

-----所以我认为这就是你想要的..

declare
v_str varchar2(100):='XY';

v_cnt number := 1;

v_text varchar2(100);
v_sysdate date := sysdate; --

begin

v_text := 'select to_char(:x,''yyyy.mm.dd'') from dual';--:x dynamically built sql statement using IN OUT v_variable1, IN v_variable2; 
dbms_output.put_line(v_text);

execute immediate v_text into v_str using in v_sysdate; 

dbms_output.put_line(v_str);
end;

你不能只是将变量放入执行字符串并期待一些东西;)你需要定义他在那个地方使用...... v_sysdate进入定义的:x地方......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-05
    • 2011-04-27
    • 1970-01-01
    • 2016-02-07
    • 2015-11-29
    • 2010-09-06
    相关资源
    最近更新 更多