如何在构造 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'
以上查询有效。谢谢!!!
我正在构造动态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'
以上查询有效。谢谢!!!