【发布时间】:2022-06-11 00:35:01
【问题描述】:
我遇到了以下错误:
ORA-00923:在预期的地方找不到 FROM 关键字
在尝试构建 plsql 脚本时:
declare
yearmonth varchar2(20) := &yearmonth ;
begin
execute IMMEDIATE 'CREATE TABLE tbl_board_new_method AS
with a as (
select u.*,case when ooo.terminal_number is not null then "BOX" else "NOBOX" end ISBOX from (
select q.*,
CASE WHEN substr(i.min_trn_date, 0, 8) IS NOT NULL AND substr(i.min_trn_date, 0, 8) < coalesce( substr(i.install_date, 0, 8) , q.install_date ) THEN
coalesce( substr(i.min_trn_date, 0, 8) , q.install_date, substr(i.install_date, 0, 8)) ELSE
coalesce(q.install_date,
substr(i.install_date, 0, 8),
substr(i.min_trn_date, 0, 8)) END f_install_date,
nvl(q.disable_date, substr(i.disable_date, 0, 8)) f_disable_date,
q.pos_model pos_model1,
q.pos_brand pos_brand1,
q.pos_brand_model pos_brand_model1 ,
CASE
WHEN UPPER(q.pos_model) IN
(:COMBO,
"DIALUP",
"LAN",
"BRANCH") THEN
"POS"
ELSE
CASE
WHEN UPPER(q.pos_model) IN
("PCPOS", "TYPICAL") THEN
"PCPOS"
ELSE
CASE
WHEN UPPER(q.pos_model) IN
("MPOS(BT/INTERNET)",
"MPOS") THEN
"MPOS"
ELSE
CASE
WHEN UPPER(q.pos_model) =
"GPRS" THEN
"GPRS"
ELSE
CASE
WHEN UPPER(q.pos_model) =
"IPG" THEN
"IPG"
ELSE
"POS"
END
END
END
END
from trg.tbl_merchant_info q
left join trg.mvw_terminal_indicators i on (q.terminal_number = i.terminal_number)
where coalesce(q.install_date,
substr(i.install_date, 0, 8),
substr(i.min_trn_date, 0, 8)) is not null
and
CASE WHEN substr(i.min_trn_date, 0, 8) IS NOT NULL AND substr(i.min_trn_date, 0, 8) < substr(i.install_date, 0, 8) THEN
coalesce( substr(i.min_trn_date, 0, 8) , q.install_date, substr(i.install_date, 0, 8)) ELSE
coalesce(q.install_date,
substr(i.install_date, 0, 8),
substr(i.min_trn_date, 0, 8)) END <= '||yearmonth||'||30
and (nvl(q.disable_date, substr(i.disable_date, 0, 8)) is null OR nvl(q.disable_date, substr(i.disable_date, 0, 8)) >='||yearmonth||'||01
)
and (trim(q.pos_model) is null or
not
(upper(q.pos_model) like "%MPOS%" ))
--- union
UNION
select q.*,
CASE WHEN substr(i.min_trn_date, 0, 8) IS NOT NULL AND substr(i.min_trn_date, 0, 8) < coalesce( substr(i.install_date, 0, 8) , q.install_date ) THEN
coalesce( substr(i.min_trn_date, 0, 8) , q.install_date, substr(i.install_date, 0, 8)) ELSE
coalesce(q.install_date,
substr(i.install_date, 0, 8),
substr(i.min_trn_date, 0, 8)) END f_install_date,
nvl(q.disable_date, substr(i.disable_date, 0, 8)) f_disable_date,
q.pos_model pos_model1,
q.pos_brand pos_brand1,
q.pos_brand_model pos_brand_model1 ,
CASE
WHEN UPPER(q.pos_model) IN
("COMBO",
"POS",
"DIALUP",
"LAN",
"BRANCH") THEN
"POS"
ELSE
CASE
WHEN UPPER(q.pos_model) IN
("PCPOS", "TYPICAL") THEN
"PCPOS"
ELSE
CASE
WHEN UPPER(q.pos_model) IN
("MPOS(BT/INTERNET)",
"MPOS") THEN
"MPOS"
ELSE
CASE
WHEN UPPER(q.pos_model) =
"GPRS" THEN
"GPRS"
ELSE
CASE
WHEN UPPER(q.pos_model) =
"IPG" THEN
"IPG"
ELSE
"POS"
END
END
END
END
END FINAL_POS_MODEL
from trg.tbl_merchant_info q
left join trg.mvw_terminal_indicators i
on (q.terminal_number = i.terminal_number)
WHERE q.terminal_number IN (SELECT terminalno FROM trg.fct_total_aggrigate_daily d WHERE substr(trn_date,0,6) = substr('||yearmonth||',0,6) )
) u left join (select * from trg.mvw_terminal_indicators ooo
where ooo.box_install is not null and (box_uninstall is null or substr(ooo.box_uninstall,0,8)>= '||yearmonth||'||01) ) ooo on (ooo.terminal_number = u.terminal_number )
a.terminal_number = t111.terminalno (+) and a.terminal_number = tt211.terminalno (+) and
a.terminal_number = ttt311.terminalno (+) and a.terminal_number = tttt411.terminalno (+) and a.terminal_number = ttttt511.terminalno (+)
)
--, pre AS (
select terminalid,
case when m.scale_install is not null then 1 else 0 end scale_install ,
yearmonth
from p left join trg.mvw_terminal_indicators m on (p.terminal_number = m.terminal_number)';
end ;
【问题讨论】:
-
这个查询太复杂了(至少对我来说)。与其执行它,不如将其存储到一个局部变量中并在屏幕上显示(使用 dbms_output.put_line)。然后复制/粘贴它并在指向错误的工具中运行它。我看到的是你引用了一些
:COMBO的东西——这肯定行不通,所以你可能想删除一个冒号。除此之外,我无法运行该代码,因为我没有您的表格。 -
是的,我明白了,但是因为代码很多,我无法完成。我删除了标志:但这不是原因。你有什么意见? _小脚丫
-
你认为投注中的部分和这个符号“”里面的字符是正确的吗?
-
声明 yearmonth varchar2(20) := &yearmonth ;开始执行 IMMEDIATE 'CREATE TABLE tbl_board_new_method AS as (select u.*,case when ooo.terminal_number is not null then "BOX" else "NOBOX" end ISBOX from (select q.*
-
从创建表的第 4 行获取错误