在Oracle SQL中创建变量

j7dteeu8  于 2023-03-22  发布在  Oracle
关注(0)|答案(3)|浏览(274)

我有超过1000行的sql查询,在每隔几行我需要改变的一年。所以,我想如果有一种方法来设置一个年在sql查询的开始,我可以改变只有一次,而不是通过整个代码进行更改。我试图建立一个sql查询,我可以像这样分配一个变量。

a in (2022,2023)

select * from transaction_table 
where Year_col in a

我知道它可以在t-sql中完成,但不确定Oracle SQL。
非常感谢您的帮助。

oyxsuwqo

oyxsuwqo1#

一个选项是将变量的内容拆分到行中。

SQL> var a varchar2(30)
SQL> exec :a := '10, 20'

PL/SQL procedure successfully completed.

SQL> select empno, ename, job, sal
  2  from emp
  3  where deptno in (select regexp_substr(:a, '[^,]+', 1, level)
  4                   from dual
  5                   connect by level <= regexp_count(:a, ',') + 1
  6                  );

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7369 SMITH      CLERK            860
      7566 JONES      MANAGER      3198.13
      7782 CLARK      MANAGER       2572.5
      7788 SCOTT      ANALYST         3225
      7839 KING       PRESIDENT       5250
      7876 ADAMS      CLERK         1182.5
      7902 FORD       ANALYST         3225
      7934 MILLER     CLERK           1365

8 rows selected.

SQL>

不是很优雅,但是-它工作。

8hhllhi2

8hhllhi22#

动态构造IN列表用于绑定通常是一个不好的做法,并且在更高的卷上确实会导致共享池的问题。IN子句的性质是,为了获得游标共享,它需要保持在固定数量的元素上,这削弱了IN的真正用途。将IN限制为静态的,硬编码的值,这些值不会在查询之间改变。
相反,您最好使用标量变量,例如:

select * from transaction where year_col = :year

select * from transaction where year_col BETWEEN :startyear AND :endyear
jvlzgdj9

jvlzgdj93#

你可以使用一个集合:

CREATE TYPE year_list IS TABLE OF NUMBER(4,0);

然后:

SELECT *
FROM   transaction
WHERE  year_col MEMBER OF year_list(2022,2023);

如果你使用的是支持绑定变量的客户端应用程序(例如Java等),那么你可以在客户端应用程序中创建一个数组,并将其作为绑定变量(Java example)传递给集合:

SELECT *
FROM   transaction
WHERE  year_col MEMBER OF :your_bind_variable

相关问题