【问题标题】:Oracle SQL Enum replacement (Not in Pl SQL)Oracle SQL 枚举替换(不在 Pl SQL 中)
【发布时间】:2020-06-02 12:15:19
【问题描述】:

我知道以前有人问过这个问题,但目前没有一个答案让我满意。

我需要任何一种模拟枚举/常量使用的方法/系统。

这个想法是像这样检索值:

Days.sunday      -- this will give the value 1

后台实现可能很复杂,但使用必须保持简单。我所说的简单的意思和上面的例子完全一样,而不是长的 select 语句等。

我尝试了函数的使用,以嵌套表作为行类型的表等等,但都包含非简单的用法,或者参考pl sql。

【问题讨论】:

  • 对不起,我不太明白你在说什么。你究竟会把Days.sunday的东西放在/写在哪里,按ENTER(我想)并得到1作为结果?操作系统提示? SQL*Plus?蟾蜍? Oracle Apex SQL 研讨会?还有什么?然后你会如何使用这个结果?
  • 你看过CONTEXTs吗?在上述情况下,您将参考:SYS_CONTEXT('DAYS','SUNDAY')
  • @Littlefoot 我会在 Oracle Apex 和 PL SQL 中使用它。例如,在 PL SQL 中,我将在 CASE / IF 语句中使用它(如果 day = Days.sunday)。在 Apex 中,它可用于显示价值或对其进行处理以显示其他内容。
  • @ConnorMcDonald 我不太了解 CONTEXT,但通过阅读,似乎它更多地用于其他目的(?)
  • 上下文只是一组键/值对......你可以按照你认为合适的方式使用它

标签: oracle enums oracle-apex constants


【解决方案1】:

我指的是以下内容:

  • 你尝试过函数
  • 全部包括非简单用法或 PL/SQL

Oracle speaks SQL 及其过程扩展,PL/SQL。我不是在谈论 Java 或不同的预编译器,因为我对这些或 JavaScript(您可以在 Oracle Apex 中使用)了解不多(或者我应该说任何东西)。

所以,如果你想让某事发生,你必须付出一些努力并使用 SQL 或 PL/SQL 编写一些代码。像days.sunday 这样的“枚举器”不能凭空存在

在阅读了您发布的 cmets 之后,我理解问题的方式导致了这个选项:带有一堆简单函数的 PL/SQL 包。实现并不复杂,使用也很简单。看看有没有帮助。

首先,我将设置环境,以便星期日是第 1 天(在我的国家,星期一是第 1 天)。

SQL> alter session set nls_territory = 'INDIA';

Session altered.

SQL> alter session set nls_date_language = 'english';

Session altered.

SQL> select to_char(date '2020-05-31', 'd'  ) day_number,
  2         to_char(date '2020-05-31', 'day') day_name
  3  from dual;

D DAY_NAME
- ---------
1 sunday

SQL>

好的;这是 2020 年 5 月 31 日的最后一个星期日。现在,包裹:

SQL> create or replace package days as
  2    function sunday    return number;
  3    function monday    return number;
  4    function tuesday   return number;
  5    function wednesday return number;
  6    function thursday  return number;
  7    function friday    return number;
  8    function saturday  return number;
  9  end;
 10  /

Package created.

SQL> create or replace package body days as
  2    function sunday    return number is begin return 1; end;
  3    function monday    return number is begin return 2; end;
  4    function tuesday   return number is begin return 3; end;
  5    function wednesday return number is begin return 4; end;
  6    function thursday  return number is begin return 5; end;
  7    function friday    return number is begin return 6; end;
  8    function saturday  return number is begin return 7; end;
  9  end;
 10  /

Package body created.

SQL>

看起来很简单,你不觉得吗?

最后,让我们按照您评论的方式使用它(注意第 4 行):

SQL> set serveroutput on
SQL>
SQL> declare
  2    day number := to_char(date '2020-05-31', 'd');
  3  begin
  4    if day = days.sunday then
  5       dbms_output.put_line('It is Sunday');
  6    else
  7       dbms_output.put_line('It is not Sunday');
  8    end if;
  9  end;
 10  /
It is Sunday

PL/SQL procedure successfully completed.

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 2015-09-16
    • 2014-08-24
    • 2018-06-18
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多