如何在 PL SQL 中声明常量而不在 "begin" 中编写过程?



我想做这样的事情:

DECLARE MY_DATE CONSTANT DATE := DATE'2022-07-01';
BEGIN null; end;
SELECT MY_DATE FROM dual

DECLARE MY_DATE CONSTANT DATE := DATE'2022-07-01';
BEGIN null; end;
SELECT CASE WHEN sysdate > MY_DATE THEN 1 ELSE 0 END FROM dual

但是我犯了错误。我该怎么修?

新增:从注释中,我看到您在包中声明了一个常量,目的是在包外的SQL语句中使用它。

您需要一个函数来返回该常量。

注意:我不建议将常量存储在包中并在SQL中使用它。我更喜欢将它们存储在一个特殊的表中,因为在添加或删除常量时会产生开销。在SQL语句中使用PLSQL常量时,由于上下文切换,性能问题也是意料之中的事。

然而,在回答您的问题时,以下是具有多个常量的包的示例:

CREATE OR REPLACE PACKAGE MYCONSTANTS 
IS 
MY_DATE CONSTANT DATE := DATE'2022-07-01'; 
MY_CHAR CONSTANT VARCHAR2(10) := 'ABCD';
function get_my_date return date;
function get_my_char return varchar2;
END;
/
create or replace PACKAGE body MYCONSTANTS IS 
function get_my_date return date
is
begin
return my_date;
end;

function get_my_char return varchar2
is
begin
return MY_CHAR;
end;
END;    
/

你可以说:

select MYCONSTANTS.get_my_date from dual;
select MYCONSTANTS.get_my_char from dual;  

旧的:据我所知,您不需要PL/SQL,只需要SQL。

PLSQL是在";"开始";以及";结束";。但在你的例子中,你只是在那里为null。

所以,你所需要的就是"定义";

def my_date = date '2022-07-01';
begin
null;
end;
/ -- you need this to start execution of an pl/sql block
select &my_date from dual; -- be aware you need to use an "&" before var name

如果使用的是最新版本,则可以在CTE:中声明本地函数

WITH
FUNCTION MY_DATE RETURN DATE IS
BEGIN
RETURN DATE '2022-07-01';
END;
SELECT MY_DATE FROM dual

或者你可以使用普通的CTE:

WITH cte (MY_DATE) AS (
SELECT DATE '2022-07-01' FROM DUAL
)
SELECT MY_DATE FROM cte

db<gt;小提琴

最新更新