有人可以帮助我理解为什么我可以在包中声明硬编码的日期值,但不能将查询中的值设为对象吗?
我已经看过许多示例(包括参考书),它们显示了硬编码值的声明,但是我无法找到通过查询将值赋值给变量的示例。
Oracle 11g。
这是允许的
create or replace package body PACKAGE_NAME AS
tDate DATE := '2012-05-30';
...procedues 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;
我已经尝试了很多方法,最后我很好用它不起作用(我可以根据程序本身的需要使用它)但我不明白为什么我不能分配一个值这样做?
具体错误是“期待......时遇到符号'SELECT'。”。
提前感谢所有人的见解
补充说我可以通过存储过程中的查询获取变量值,但是相同的过程似乎不适用于包体。
PROCEDURE Proc_Name IS
tDate Date;
BEGIN
SELECT MAX(date_) into tDate from Table_Name;
答案 0 :(得分:9)
您需要在包体中创建包初始化块。这是一个相对晦涩的PL / SQL包传说,但它可以使用。这是一个例子:
CREATE OR REPLACE PACKAGE TEST_PKG IS
tDate DATE;
END TEST_PKG;
这里我们创建了一个只包含一个DATE变量的包规范。现在我们将创建一个简单的主体,使用SELECT语句初始化该变量:
CREATE OR REPLACE PACKAGE BODY TEST_PKG IS
-- Following BEGIN-END block 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;
它应该打印当前日期。
分享并享受。
答案 1 :(得分:1)
直接选择变量时,您需要使用INTO
。
select MAX(date_)
INTO tDate
from Table_Name;