gpt4 book ai didi

sql - 如何通过 SELECT 声明和初始化包变量

转载 作者:行者123 更新时间:2023-12-04 22:49:31 24 4
gpt4 key购买 nike

有人能帮我理解为什么我可以在包中声明一个硬编码的日期值但不能从查询中分配值吗?我看过许多示例(包括引用书),它们显示了硬编码值的声明,但我无法找到通过查询为变量赋值的示例。
这是允许的:

create or replace package body PACKAGE_NAME AS
tDate DATE := '2012-05-30';
-- ...procedures follow
这是允许的:
create or replace package body PACKAGE_NAME AS
tDate DATE := sysdate;
这是不允许的:
create or replace package body PACKAGE_NAME AS
tDate DATE := select MAX(date_) from Table_Name;
我已经尝试了多种方法,但我认为它不起作用 - 我可以根据需要在程序本身中使用它。但我想知道为什么我不能为 tDate 赋值这边走?具体错误是:

Encountered the symbol 'SELECT' when expecting ....


添加我可以通过存储过程中的查询获取分配的变量值,但相同的过程似乎不适用于包体。
PROCEDURE Proc_Name IS
tDate Date;
BEGIN
SELECT MAX(date_) into tDate from Table_Name;

最佳答案

您需要在包体中创建一个包初始化块。这是一个相对神秘的 PL/SQL 包知识,但它就在那里并且可以使用。下面是一个例子:

CREATE OR REPLACE PACKAGE TEST_PKG IS
tDate DATE;
END TEST_PKG;
在这里,我们创建了一个仅包含单个 DATE 变量的包规范。现在我们将创建一个简单的主体,它使用 SELECT 语句初始化该变量:
CREATE OR REPLACE PACKAGE BODY TEST_PKG IS
-- package-private variables go first (if any)
(...)
-- then the public functions/procedures
(...)
-- then a final BEGIN-END block which is the package initialization block
BEGIN
SELECT SYSDATE
INTO tDATE
FROM DUAL;
EXCEPTION -- you can have exception handlers in your initialization block
WHEN OTHERS THEN
NULL; -- pointless here, but this is just an example
RAISE;
END TEST_PKG;
现在,如果您执行以下操作:
begin
-- Test statements here
DBMS_OUTPUT.PUT_LINE('TEST_PKG.tDate = ' || TEST_PKG.tDate);
end;
它应该打印当前日期。
分享和享受。

关于sql - 如何通过 SELECT 声明和初始化包变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10851769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com