在简单的sql语句中使用define

时间:2015-01-09 06:30:01

标签: sql oracle

是否有一种方法可以将SQL的一部分定义为在简单的Oracle SQL语句中重复使用的常量。以类似的方式可以在脚本中以与WITH语句类似的方式完成吗?

这样的东西
Define meat as "foodtype<>'fruit' and foodtype<>'veg'"

select * from meals where meat

2 个答案:

答案 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>

注意 DEFINESQL*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