【问题标题】:digest apostrophe in substitution variable在替换变量中消化撇号
【发布时间】:2015-12-17 10:24:00
【问题描述】:

要求是将带有单引号的变量作为参数传递给立即执行。到目前为止,我已经尝试了下面的代码 sn-p..

如何让下面的代码工作??

declare
v_val varchar2(5);
v_match varchar2(5);
v_query VARCHAR2(500);
begin
v_val:='a''a';
  dbms_output.put_line(v_val);
v_val:=replace(v_val,'''','''''');
  dbms_output.put_line(v_val);
  v_query:='select val from test where val='||''''||v_val||''''||' and 1=1';                    
  execute immediate v_query into v_match;
  if(v_match=v_val) then
  dbms_output.put_line('match found');
  else
  dbms_output.put_line(' no match found');
end if;
  end;

换句话说: 我想接受一个带撇号的输入到替换变量中,然后在 select 语句的 where 子句中使用该变量从表中提取数据。

i/p 值:a'a select * from table where keyval=&inputval;

【问题讨论】:

  • 为什么不用绑定变量?
  • REPLACE 调用v_val 之后应该有a''a,但是您的SELECT 语句正在寻找v_val 中不存在的前导和尾随撇号。也许这会给你一个想法。祝你好运。

标签: sql oracle plsql


【解决方案1】:

使用绑定变量:

declare
  v_val varchar2(5);
  v_match varchar2(5);
  v_query VARCHAR2(500);
begin
  v_val:='aa';
  dbms_output.put_line(v_val);
  v_val:=replace(v_val,'''','''''');
  dbms_output.put_line(v_val);
  v_query:='select val from test where val=:val and 1=1';                    
  execute immediate v_query into v_match using v_val;
  dbms_output.put_line('match found');
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    dbms_output.put_line(' no match found');
end;
/

或者不使用动态 SQL:

declare
  v_val   TEST.VAL%TYPE;
  v_match TEST.VAL%TYPE;
begin
  v_val:='a''a';
  dbms_output.put_line(v_val);
  v_val:=replace(v_val,'''','''''');
  dbms_output.put_line(v_val);
  select val INTO v_match from test where val=v_val;
  dbms_output.put_line('match found');
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    dbms_output.put_line(' no match found');
end;
/

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2015-05-30
    • 2014-07-22
    • 2013-01-04
    相关资源
    最近更新 更多