任何人都可以帮我解决这个错误吗?我想要执行立即创建表语句,该语句连接将每天/每月更改的表名。
这是我的代码......
DECLARE
v_table_name VARCHAR2(100);
v_get_fromdate VARCHAR2(200);
BEGIN
v_table_name := 'mpiat_after_bs_' || SUBSTR(TO_CHAR(SYSDATE, 'ddmonyy'), 3, 5) || '_t';
v_get_fromdate := 'select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2
) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual;';
EXECUTE IMMEDIATE ''
CREATE TABLE ' || v_table_name || ' AS
SELECT column1 ,
column2 ,
column3 ,
column4 ,
column5
FROM table_name
WHERE column1 >=' || v_get_fromdate ||'
AND column3 LIKE ''tbl_%''';
END;
这是我得到的错误......
Error report -
ORA-00936: missing expression
ORA-06512: at line 7
00936. 00000 - "missing expression"
*Cause:
*Action:
Line 7 is EXECUTE IMMEDIATE 'CREATE TABLE ' || v_table_name || ' AS SELECT column1
我已经搜索了很多关于此问题的代码......但我还没有看到有人在创建表格时将表名称连接为变量。
我只想知道这是否可行。我愿意为此提出任何建议。谢谢!
答案 0 :(得分:1)
行 -
EXECUTE IMMEDIATE ''
您只需要1个引号而不是2个引号
将其更改为
EXECUTE IMMEDIATE '
行
v_get_fromdate := 'select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2
) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual;';
应该是
v_get_fromdate := '(select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2
) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual)';
半冒号不能在子查询中使用。
答案 1 :(得分:0)
根据您的代码,我们不需要SELECT语句从oracle函数获取值。我们应该尽可能避免动态查询。希望下面的代码段有用。
DECLARE
v_table_name VARCHAR2(100);
v_get_fromdate VARCHAR2(200);
BEGIN
v_table_name := 'mpiat_after_bs_' || SUBSTR(TO_CHAR(SYSDATE, 'ddmonyy'), 3, 5) || '_t';
V_GET_FROMDATE := GET_FROMDATE(TO_DATE('01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2) ||'/2017 00:00:00','dd/mm/yyyy hh24:mi:ss'),'R');
EXECUTE IMMEDIATE '
CREATE TABLE ' || v_table_name || ' AS
SELECT column1 ,
column2 ,
column3 ,
column4 ,
column5
FROM table_name
WHERE column1 >=' || v_get_fromdate ||'
AND column3 LIKE ''tbl_%''';
END;
/