Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在简单sql语句中使用define_Sql_Oracle - Fatal编程技术网

在简单sql语句中使用define

在简单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块中实现

有没有一种方法可以将SQL的一部分定义为常量,以便在简单的oracle SQL语句中重复使用。以类似于脚本和WITH语句的方式完成

差不多

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语句的搜索和替换。