【问题标题】:Implementing IF statement on Oracle Database在 Oracle 数据库上实现 IF 语句
【发布时间】:2017-02-24 03:33:24
【问题描述】:

我正在尝试实现一个 IF 语句来在我的 Oracle 数据库上运行查询。

期望: 如果员工叫 John,则显示有限项(item1 和 item2),如果不是 John,则显示完整列表。

DECLARE
  employeeName STRING := 'John';
   
BEGIN
IF (employeeName = 'John') THEN
       (SELECT TableA.Table from Table where TableA.Table = 'Item1' OR TableA.Table = 'Item2');
ELSE 
       (SELECT TableA.Table from Table);
END IF;
END; 

这是错误输出:

错误报告:ORA-06550:第 6 行,第 2 列:PLS-00103:在预期以下情况之一时遇到符号“ ”:

( begin case declare exit for goto if loop mod null pragma raise return select update while with 'an identifier' 'a double-quoted delimited-identifier' '绑定变量' ""继续关闭当前 删除获取锁插入打开回滚保存点设置sql执行 提交 forall 合并管道清除 06550. 00000 - “第 %s 行,第 %s 列:\n%s”

*原因:通常是 PL/SQL 编译错误。

*行动:

我做错了什么?请原谅我对在数据库上实现的 IF 语句的无知。

【问题讨论】:

  • 这是 PL/SQL,你不能像那样嵌入 SQL - 你需要定义如何处理结果(例如SELECT .. INTO ..)。

标签: database oracle if-statement


【解决方案1】:

在您的代码中,

  • table 是保留关键字。使用双引号或其他标识符
  • 缺少选择into
  • 字符串缺少长度

您可以在单个 SQL 中应用您的条件,然后使用 for 循环遍历结果集。

DECLARE
  employeeName varchar2(100) := 'John';

BEGIN
    for t in (select "table" from tablea 
              where "table" in ('item1', 'item2')
                    or employeename = 'john') loop
        dbms_output.put_line(t."table");
    end loop;
END;
/

【讨论】:

  • 表被用作通用名称,我的表有一个不同的名称,称为 employees.employeeName。 'for' 语句不会使用更多资源吗?
  • 您的目标到底是什么?如果可以通过基于集合的方法实现,那么一定要使用 SQL 操作。如果您的目标需要采用程序方法,那么 for 是一种可行的方法。如果合适,最好与 BULK COLLECT 和 FORALL 结合使用
  • 因此,如果员工名为 John,他是唯一的实习生,他只能查看员工列表,如果他不是 John,他将获得完整的列表。如果不使用“声明”就可以实现这一点,那将是完美的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多