如何在构造select语句时使用单引号两次

时间:2016-02-03 09:39:07

标签: oracle select plsql dynamic-sql

我正在构建Dynamic Sql,不明白如何在select语句中使用单引号,其中包含一些变量

对于例如

SELECT ABC.NEXTVAL,'||val_name||' Vname,'||ta_tab||' Tname,'||', Accnt_id, rowid from emp;

其中val_name和ta_tab不是表Emp的列,但是这些是在块中计算的变量,我要求它们直接插入到另一个表中。

如何解决这个,我尝试使用'双引号',但它不起作用,并且不打印变量值(它被视为字符串)

4 个答案:

答案 0 :(得分:2)

正如其他人所提到的,这里不需要动态SQL

但是,如果你只是想知道如何使用单引号进行学习,这是一个例子,

SQL> SET serveroutput ON
SQL> DECLARE
  2    val_name VARCHAR2(10);
  3    ta_tab   VARCHAR2(10);
  4    v_str    VARCHAR2(100);
  5    A        VARCHAR2(10);
  6    b        VARCHAR2(10);
  7    c        VARCHAR2(10);
  8    d        NUMBER;
  9  BEGIN
 10    val_name := 'LALIT';
 11    ta_tab   := 'TEST';
 12    v_str    :='SELECT '''||val_name||''', ename,'''||ta_tab||''', sal from emp where empno = 7788';
 13    EXECUTE IMMEDIATE v_str INTO A,b,c,d;
 14    dbms_output.put_line(a||'-'||b||'-'||c||'-'||d);
 15  END;
 16  /
LALIT-SCOTT-TEST-3000

PL/SQL procedure successfully completed.

还有其他一些事项要记住,比如使用绑定变量等。但是,它超出了本主题的范围。

答案 1 :(得分:1)

您可以使用文字引语:

stmt := q'[SELECT ABC.NEXTVAL,'||val_name||' Vname,'||ta_tab||' Tname,'||', Accnt_id, rowid from emp]';

文字的文档可以在这里找到:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#sthref344

或者,您可以使用三个引号来表示单引号:

stmt := 'SELECT ABC.NEXTVAL,'''||val_name||''' Vname,'''||ta_tab||''' Tname,'''||''', Accnt_id, rowid from emp';

使用Q语法的文字引用机制更灵活,更易读,IMO。

答案 2 :(得分:0)

为什么不能直接在SQL中使用变量,而不是使用动态sql? E.g:

HTTP/1.1 200 OK
Server: Apache/2.4.18 (Ubuntu)
ETag: "dd6d718cc03aac91085163fd1927f07a-gzip"
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Date: Wed, 03 Feb 2016 13:17:48 GMT
X-Varnish: 1965452251 1965452250
Age: 13
Via: 1.1 varnish
Connection: keep-alive

答案 3 :(得分:0)

团队,我找到了答案。在oracle我必须使用' 3次

E.g。

stmt:='选择ABC.NEXTVAL,'' || val_name ||''' VNAME,''' || || ta_tab''' Tname,'' ||'',Accnt_id,来自emp'

的rowid

以上查询有效。感谢!!!