【问题标题】:Dynamic SQL: how to handle single quote in select statement动态 SQL:如何处理 select 语句中的单引号
【发布时间】:2015-05-11 12:16:02
【问题描述】:

基本上,我想使用他/她的职位和位置从数据库中搜索员工。我使用动态 sql (dbms_sql.v7) 编写了一个函数名 searchemp。

表结构

Emp表:

Empno number
Ename varchar
Job   varchar
Deptno number

部门表

DEPTNO number
DNAME  varchar        
LOC    varchar

所以我的选择语句如下所示:

  select_stm:= 'SELECT * FROM emp FULL OUTER JOIN dept ON emp.deptno =   dept.deptno where job = ' || UPPER(e_job) || ' and loc = ' || UPPER(e_loc);
  • 使用大写是因为这两个表中的所有内容都是大写的。
  • 函数名是这样调用的

    SQL> execute searchemp('&job', '&loc');
    Enter value for job: clerk
    Enter value for loc: dallas
    

当我在屏幕上显示sql语句时:

   SELECT * FROM emp FULL OUTER JOIN dept ON emp.deptno = dept.deptno where job = CLERK and loc = DALLAS;

我的错误是 CLERK 和 DALLAS 的标识符无效。 CLERK 和 DALLAS 周围也没有单引号,因此在数据库中找不到任何员工。如果参数是数字(即empno),则该函数可以正常工作。

我在 SQL*Plus 中测试过的 sql 语句很好。 如何处理单引号以显示我想要的内容?

【问题讨论】:

    标签: dynamic plsql


    【解决方案1】:

    这里有几个猜测,因为它不拿起单引号很奇怪。:

    首先,SQL 末尾缺少单引号。你有什么理由使用管道||?

    select_stm:= 'SELECT * FROM emp FULL OUTER JOIN dept ON emp.deptno =   dept.deptno where job = ' || UPPER(e_job) || ' and loc = ' || UPPER(e_loc) || ';
    

    如果你使用类似下面的语句会出现同样的错误吗?

    select_stm:= 'SELECT * FROM emp FULL OUTER JOIN dept ON emp.deptno =   dept.deptno where job like '% || UPPER(e_job) || %' and loc and '% || UPPER(e_loc) %';
    

    【讨论】:

    • 我使用管道 ||因为变量 e_job 和 e_loc 周围有单引号(我忘了把单引号放在上面的 select stm 中)
    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2013-06-14
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多