在简单sql语句中使用define
有没有一种方法可以将SQL的一部分定义为常量,以便在简单的oracle SQL语句中重复使用。以类似于脚本和WITH语句的方式完成 差不多在简单sql语句中使用define,sql,oracle,Sql,Oracle,有没有一种方法可以将SQL的一部分定义为常量,以便在简单的oracle SQL语句中重复使用。以类似于脚本和WITH语句的方式完成 差不多 Define meat as "foodtype<>'fruit' and foodtype<>'veg'" select * from meals where meat 将肉定义为“foodtype‘水果’和foodtype‘蔬菜’” 从含有肉类的食物中选择* 根据您的问题,情况似乎应该是动态的。它可以在下面的PLSQL块中实现
Define meat as "foodtype<>'fruit' and foodtype<>'veg'"
select * from meals where meat
将肉定义为“foodtype‘水果’和foodtype‘蔬菜’”
从含有肉类的食物中选择*
根据您的问题,情况似乎应该是动态的。它可以在下面的PLSQL
块中实现
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
声明
v1 varchar2(100):=“食品类型”水果“和食品类型”蔬菜”;
mealstyp餐食%行类型;
开始
立即执行“从膳食中选择*”| | v1到膳食类型;
环
--你的打字记录
端环;
结束
在SQL*Plus
中,您可以使用定义
比如说,
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>
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>
注意DEFINE
是一个SQL*Plus
命令。定义设置用户变量或显示其值
但是,在普通的SQL
中不可能,因为查询不会解析
,并且会抛出错误。因为在解析期间,Oracle希望它是静态的
,所以您不能让它动态的
您可以在PL/SQL
中使用Dynamic SQL
,这样您就可以将其作为字符串变量
并在会话范围内重复使用
比如说,
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>
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>
只需在
SQL*Plus
中使用DEFINE
。请看我的答案。我的问题是,这是否可以不用SQL*plus完成?您在问题中没有提到这一点。无论如何,是的,你可以在PL/SQL
中这样做,正如我在回答中所示。但是,在普通的SQL
中,没有。您从哪里运行查询?从另一个客户端还是从应用程序?如果是后者,您的应用程序可以在执行之前操作查询字符串,使用Java、C、PHP,甚至是shell脚本,等等?我的目标是设置一个我的应用程序可以使用的视图。如果该设施不存在于普通SQL中,我认为它将是一个相对简单和有用的扩展,可能是Oracle将来可以考虑的。我不需要它是动态的。我设想在运行查询时发生的第一件事将相当于基于define语句的搜索和替换。