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

How to use single quote twice in constructing select statement

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

例如

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

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

如何解决这个问题,我试过使用 'Double-quotes' 但它不起作用,变量值也没有打印出来(它被认为是字符串)

您可以使用文字引号:

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';

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

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

declare
  val_name varchar2(30) := 'fred';
  ta_tab varchar2(30) := 'bob';
begin
  insert into some_table (id, vname, tname, accnt_id, row_id)
  select abc.nextval,
         val_name vname,
         ta_tab tname,
         accnt_id,
         rowid
  from   emp;
end;
/

正如其他人提到的,这里不需要 dynamic 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.

还有其他需要注意的事项,例如使用绑定变量等。但是,这超出了本主题的范围。

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

例如

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

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