Oracle 如何使用sqlplus脚本中表格中select max(colx)返回的值填充替换变量?

Oracle 如何使用sqlplus脚本中表格中select max(colx)返回的值填充替换变量?,oracle,sqlplus,substitution,Oracle,Sqlplus,Substitution,我希望将select maxcolumn from mytable返回的值放入脚本中,以便在使用SQL*PLUS运行的同一脚本中的多个后续SQL语句中使用该值,而不是在脚本中的后续SQL中的多个实例中执行select maxcolumn from mytable。有几种方法可以实现这一点,但能够定义替换变量,然后使用select语句设置其值显然是最简单、最清晰的编写方法,因为绑定变量似乎需要不同的编写风格、更高的复杂性,对于那些将来可能需要进行更改的人来说,这一点不太清楚。没问题-使用变量。以下

我希望将select maxcolumn from mytable返回的值放入脚本中,以便在使用SQL*PLUS运行的同一脚本中的多个后续SQL语句中使用该值,而不是在脚本中的后续SQL中的多个实例中执行select maxcolumn from mytable。有几种方法可以实现这一点,但能够定义替换变量,然后使用select语句设置其值显然是最简单、最清晰的编写方法,因为绑定变量似乎需要不同的编写风格、更高的复杂性,对于那些将来可能需要进行更改的人来说,这一点不太清楚。

没问题-使用变量。以下是方法:

声明一个变量;使用exec将值放入其中:

SQL> var max_deptno number;
SQL> exec select max(deptno) into :max_deptno from emp;

PL/SQL procedure successfully completed.
里面有什么

SQL> print max_deptno

MAX_DEPTNO
----------
        30
在后续选择中使用它:

SQL> select ename, job, sal from emp where deptno = :max_deptno;

ENAME      JOB              SAL
---------- --------- ----------
ALLEN      SALESMAN        1600
WARD       SALESMAN        1250
MARTIN     SALESMAN        1250
BLAKE      MANAGER         2850
TURNER     SALESMAN        1500
JAMES      CLERK            950

6 rows selected.

SQL> select * from dept where deptno = :max_deptno;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

SQL>
这允许我创建一个仅包含最近一个月的案例条目的表,并将所有其他案例条目放入另一个临时表中,其中load_month!=:每月最大负荷。我之所以需要这样做,是因为案例表的更新运行了20多个小时,通过将正在更新的记录仅放在一个临时表中,更新只需5分钟,然后我可以使用两个临时表之间的UNION ALL重新创建案例表。我认为这会起作用,但不想在更新查询中两次使用select maxload_MOUNT-似乎太多了,无法为处理的每个记录获取2019-11格式的值

谢谢你的帮助。我仍然在想一个方法来分配选择的值
将最大负荷(即2019-11)设为替代变量是理想的。在SQL Developer中,define max_load_month=从casetable worked中选择maxload_month,但并不像我希望的那样。在SQLDeveloper中,它似乎替换了查询,然后在使用变量的地方执行查询,当时我打算将查询的值分配给max_load_month,而不是查询。但是在PL/SQL中,由于查询格式不正确,定义失败。

谢谢提供信息。是的,这确实可以很好地将值放入Bind变量,但它本身并不能解决所有相关问题。尝试将create table mytable中的bind变量用作inp_表中的select*,其中columnx=:max_columnx失败,生成ORA-01027:数据定义操作不允许使用bind变量。为了以最简单的方式解决这个问题,我在加载绑定变量值后插入了以下行:define mymax=:max\u columnx。使用替换变量未生成错误。发言过快。显然,绑定变量不能作为select DDL在CREATE TABLE中使用,当我执行define var=bind_var时,替换只是简单地替换回绑定变量,所以我还是得到了ORA-01027错误。我可以编写CREATE Table来使用WHERE Colx=select maxcolx from Table,但整个意图是用一个基本上是常量的文本来替换select执行,这个常量是以前确定和存储的,以最小化资源利用率。确切地说,绑定变量不能用于CREATE Table,这现在也没什么不寻常的。一种解决方法是使用某种占位符,例如。。。其中colx=PAR_MAXX,您将在编辑器中执行replace all,将PAR_MAXX替换为例如6637或其他值。或者,切换到动态SQL,但它不可扩展且难以维护。我建议您熟悉动态SQL。我认为这会使你的帖子更容易阅读和理解。
SQL> var max_loaD_MONTH VARCHAR(20);
SQL> exec select max(LOAD_MONTH) into :max_LOAD_MONTH from CASETABLE;)

SQL> CREATE TABLE NEW_CASES AS SELECT * FROM CASETABLE WHERE ROWNUM < 1;

SQL> INSERT INTO NEW_CASES AS SELECT * FROM CASETABLE WHERE LOAD_MONTH = :max_load_month;