我想编写可重用代码,需要在开始时声明一些变量,并在脚本中重用它们,例如:

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;

如何声明一个变量并在后面的语句中重用它,例如在使用SQLDeveloper时.


Attempts

  • 使用DECLARE部分并在BEGINEND;中插入以下SELECT语句.使用&stupidvar访问变量.
  • 使用关键字DEFINE并访问变量.
  • 使用关键字VARIABLE并访问变量.

但在我的try 中,我遇到了各种各样的错误(未绑定变量、语法错误、预期SELECT INTO…).

推荐答案

在SQL*Plus脚本中有几种声明变量的方法.

第一种方法是使用VAR来声明绑定变量.为VAR赋值的机制是通过EXEC调用:

SQL> var name varchar2(20)
SQL> exec :name := 'SALES'

PL/SQL procedure successfully completed.

SQL> select * from dept
  2  where dname = :name
  3  /

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

SQL>

当我们想要调用具有OUT参数或函数的存储过程时,VAR特别有用.

或者,我们可以使用替代变量.这些都适用于交互模式:

SQL> accept p_dno prompt "Please enter Department number: " default 10
Please enter Department number: 20
SQL> select ename, sal
  2  from emp
  3  where deptno = &p_dno
  4  /
old   3: where deptno = &p_dno
new   3: where deptno = 20

ENAME             SAL
---------- ----------
CLARKE            800
ROBERTSON        2975
RIGBY            3000
KULASH           1100
GASPAROTTO       3000

SQL>

当我们编写一个调用其他脚本的脚本时,预先定义变量是很有用的.此代码段运行时不会提示我输入值:

SQL> def p_dno = 40
SQL> select ename, sal
  2  from emp
  3  where deptno = &p_dno
  4  /
old   3: where deptno = &p_dno
new   3: where deptno = 40

no rows selected

SQL>

最后是匿名PL/SQL块.如您所见,我们仍然可以交互地为声明的变量赋值:

SQL> set serveroutput on size unlimited
SQL> declare
  2      n pls_integer;
  3      l_sal number := 3500;
  4      l_dno number := &dno;
  5  begin
  6      select count(*)
  7      into n
  8      from emp
  9      where sal > l_sal
 10      and deptno = l_dno;
 11      dbms_output.put_line('top earners = '||to_char(n));
 12  end;
 13  /
Enter value for dno: 10
old   4:     l_dno number := &dno;
new   4:     l_dno number := 10;
top earners = 1

PL/SQL procedure successfully completed.

SQL>

Sql相关问答推荐

Select /过滤postgr中的树 struct

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

一个SQL查询将在需要的地方多次返回同一成员

PostgreSQL基于2个COLS的任意组合 Select 唯一行

从包含PostgreSQL中的JSON值的列中提取列表或目录

如何在Postgres中为单值输入多行?

更正用于判断错误组合的SQL

改进的SQL子字符串提取

不存在记录的国外关键点

使用 SQL 将列添加到 Access 数据库时出错

如何在 SQL Server 中解决这个复杂的窗口查询?

删除每个不同日期中未 Select 的最短最长时间

识别SQL Server中的重复数字

汇总具有连续日期范围的行

根据行号将列转置为没有任何id或键列的行

如何更改 duckdb R 中的数据约束

并非所有变量都绑定在 PL SQL 函数中

根据开始/结束标记将 GROUP_ID 分配给行

当计数为 0 时显示行

使用一组值进行分组和计数