是否有一种方法可以将SQL的一部分定义为在简单的Oracle SQL语句中重复使用的常量。以类似的方式可以在脚本中以与WITH语句类似的方式完成吗?
像
这样的东西Define meat as "foodtype<>'fruit' and foodtype<>'veg'"
select * from meals where meat
答案 0 :(得分:1)
在SQL*Plus
中,您可以使用DEFINE
。
例如,
SQL> define l_str = 'ename = ''SCOTT'''
SQL>
SQL> select empno, deptno from emp where &l_str;
old 1: select empno, deptno from emp where &l_str
new 1: select empno, deptno from emp where ename = 'SCOTT'
EMPNO DEPTNO
---------- ----------
7788 20
SQL>
注意 DEFINE
是SQL*Plus
命令。定义设置用户变量或显示其值。
但是,由于查询赢得了SQL
并且会引发错误,因此无法在普通parse
中使用。因为在解析时,Oracle会期望它是static
,所以你不能拥有它dynamic
。
您可以在Dynamic SQL
中使用PL/SQL
,以便将其作为string variable
使用,并在会话范围内重复使用。
例如,
SQL> DECLARE
2 var_str VARCHAR2(1000);
3 var_str1 VARCHAR2(1000);
4 v_empno emp.empno%type;
5 BEGIN
6 var_str := 'ename = ''SCOTT''';
7 var_str1 := 'select empno FROM emp WHERE '|| var_str;
8 EXECUTE IMMEDIATE var_str1 INTO v_empno;
9
10 dbms_output.put_line(v_empno);
11
12 END;
13 /
7788
PL/SQL procedure successfully completed.
SQL>
答案 1 :(得分:0)
根据您的问题,似乎情况应该是动态的。它可以在PLSQL
Block中实现,如下所示
DECLARE
v1 varchar2(100) := ' foodtype <> ''fruit'' and foodtype <> ''Veg''';
mealstyp meals%ROWTYPE;
BEGIN
EXECUTE IMMEDIATE 'select * from meals where'||v1 into mealstyp;
LOOP
--your type record
END LOOP;
END