使用 to_date ORACLE 立即格式化执行
Formatting execute immediate with to_date ORACLE
我卡在包内的格式化过程中.....脚本工作正常,但事实证明将其与包集成很困难!!
我不习惯 oracle...我有脚本 运行 但不在包中...好吧,不是全部...Drop Table worked
CREATE OR REPLACE PACKAGE BODY Testing is
PROCEDURE DropTable1 IS
BEGIN
execute immediate ('DROP TABLE mytable1');
END;
PROCEDURE PopulateTable1 IS
BEGIN
execute immediate ('CREATE TABLE mytable1
AS (
select
substr(t1.genarea,3,3) as M_Class,
substr(t1.genarea,6,30) as M_Description,
substr(t1.genarea,36,3) as M_Class,
substr(t1.genarea,39,30) as M_Description,
substr(t1.itemitem,1,3) as product_code,
t3.CHANNEL_NUM as SALES_CHANNEL,
to_date(''t2.time_id'',''dd-mon-yyyy'') as mis_date,
sum(t2.ap_cw_cfi_irp+t2.ap_cw_issues_irp) as ap_gross,
sum(t2.Ap_Cw_Cfi_Irp+t2.Ap_Revivals_Irp) as ap_net,
sum(t2.sp_inc_irp+t2.sp_issues_irp) as sp_gross,
sum(t2.sp_dec_irp+t2.sp_fs_irp) as sp_net
from
d_pr t1, act t2, age_map t3
where
t1.pfx=''IT'' and t1.coy=''1'' and t1.tabl=''T81'' and substr(t1.itemitem,1,3) = t2.product_id and t3.AGE_NUM = t2.age_id
group by
substr(t1.genarea,3,3),
substr(t1.genarea,6,30),
substr(t1.genarea,36,3),
substr(t1.genarea,39,30),
substr(t1.itemitem,1,3),
t3.CHANNEL_NUM,
to_date(''t2.time_id'',''dd-mon-yyyy'')
)');
COMMIT;
END PopulateTable1;
END Testing;
/
谢谢
你不应该在 t2.time_id
周围加上引号。单引号用于表示字符串文字;这显然是专栏参考。
BEGIN
execute immediate ('CREATE TABLE mytable1 AS
(select to_date(/*remove single quotes here*/t2.time_id/*and here*/,''dd-mon-yyyy'') as mis_date
from (select current_date time_id from dual) t2)');
end;
并且在 select 查询的最后一行。因为它被视为字符串
您的代码中有两处看起来很奇怪:
to_date(''t2.time_id'',''dd-mon-yyyy'')
列周围不需要任何单引号,只需要字符串文字周围的单引号.将其更改为:
to_date(t2.time_id,''dd-mon-yyyy'')
如果您在多个地方遇到单引号问题,那么我建议您 Quoting string literal technique to avoid errors due to single-quotation marks in the string. For example, see
COMMIT;
对于 DDL 语句,您不需要 COMMIT,您只需要为 DML[=34= 提交] 声明。删除它。
我卡在包内的格式化过程中.....脚本工作正常,但事实证明将其与包集成很困难!!
我不习惯 oracle...我有脚本 运行 但不在包中...好吧,不是全部...Drop Table worked
CREATE OR REPLACE PACKAGE BODY Testing is
PROCEDURE DropTable1 IS
BEGIN
execute immediate ('DROP TABLE mytable1');
END;
PROCEDURE PopulateTable1 IS
BEGIN
execute immediate ('CREATE TABLE mytable1
AS (
select
substr(t1.genarea,3,3) as M_Class,
substr(t1.genarea,6,30) as M_Description,
substr(t1.genarea,36,3) as M_Class,
substr(t1.genarea,39,30) as M_Description,
substr(t1.itemitem,1,3) as product_code,
t3.CHANNEL_NUM as SALES_CHANNEL,
to_date(''t2.time_id'',''dd-mon-yyyy'') as mis_date,
sum(t2.ap_cw_cfi_irp+t2.ap_cw_issues_irp) as ap_gross,
sum(t2.Ap_Cw_Cfi_Irp+t2.Ap_Revivals_Irp) as ap_net,
sum(t2.sp_inc_irp+t2.sp_issues_irp) as sp_gross,
sum(t2.sp_dec_irp+t2.sp_fs_irp) as sp_net
from
d_pr t1, act t2, age_map t3
where
t1.pfx=''IT'' and t1.coy=''1'' and t1.tabl=''T81'' and substr(t1.itemitem,1,3) = t2.product_id and t3.AGE_NUM = t2.age_id
group by
substr(t1.genarea,3,3),
substr(t1.genarea,6,30),
substr(t1.genarea,36,3),
substr(t1.genarea,39,30),
substr(t1.itemitem,1,3),
t3.CHANNEL_NUM,
to_date(''t2.time_id'',''dd-mon-yyyy'')
)');
COMMIT;
END PopulateTable1;
END Testing;
/
谢谢
你不应该在 t2.time_id
周围加上引号。单引号用于表示字符串文字;这显然是专栏参考。
BEGIN
execute immediate ('CREATE TABLE mytable1 AS
(select to_date(/*remove single quotes here*/t2.time_id/*and here*/,''dd-mon-yyyy'') as mis_date
from (select current_date time_id from dual) t2)');
end;
并且在 select 查询的最后一行。因为它被视为字符串
您的代码中有两处看起来很奇怪:
to_date(''t2.time_id'',''dd-mon-yyyy'')
列周围不需要任何单引号,只需要字符串文字周围的单引号.将其更改为:
to_date(t2.time_id,''dd-mon-yyyy'')
如果您在多个地方遇到单引号问题,那么我建议您 Quoting string literal technique to avoid errors due to single-quotation marks in the string. For example, see
COMMIT;
对于 DDL 语句,您不需要 COMMIT,您只需要为 DML[=34= 提交] 声明。删除它。