暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 创建和执行存储过程,动态构建表获取ORA-06550: PLS-00103

askTom 2016-07-13
200

问题描述

接收ORA-06550: 尝试执行动态创建表的过程时PLS-00103错误。

我已经创建了一个pl/sql脚本来动态创建一个表:
声明
l_tablename varchar2(30) := 'TEST_3 _' | to_char(sysdate,'YYYYMMDD');
l_from_table varchar2(30):= 'abc.pxr95ef '; -- parm3中的函数

开始
立即执行 '创建表' | | l_tablename | | '作为select * from' | | l_from_table;
结束;
/

当我从蟾蜍运行这个脚本时,它工作得很好。

然后,我使用上面的pl/sql脚本创建了一个过程,该过程成功创建:
创建或替换过程asu_p_build_table_name(beg VARCHAR2,语句varchar2,sourc varchar2)
作为
表名varchar2(30) := asu_p_build_table_name.beg | | to_char(sysdate,'YYYYMMDD');
l_from_table varchar2(30):= asu_p_build_table_name.sourc;
l_get_data varchar2(1000) := asu_p_build_table_name.语句;
开始
立即执行 '创建表' | | l_tablename | | l_get_data | | l_from_table;
结束;
/

我的问题是,当我尝试执行过程:
执行asu_f_build_table_names ('ftest1 _ ',' 作为select * ffen','abc.pxr95ef;');
我得到以下错误:
ORA-06550: 第1行,第101列:
PLS-00103: 遇到以下情况之一时遇到符号 “文件结尾”:

( 开始 case 声明 end exception exit for goto if loop mod
null pragma提高返回选择更新,而与
<标识符> <双引号分隔标识符>
<绑定变量> <<继续关闭当前的删除获取锁
插入打开的回滚保存点集sql execute commit forall
合并管吹扫


专家解答

SQL> CREATE OR REPLACE procedure asu_p_build_table_name(beg VARCHAR2,statements varchar2,sourc varchar2)
  2  AS
  3  l_tablename varchar2(30) := asu_p_build_table_name.beg||to_char(sysdate, 'YYYYMMDD');
  4  l_from_table varchar2(30):= asu_p_build_table_name.sourc;
  5  l_get_data varchar2(1000) := asu_p_build_table_name.statements;
  6  begin
  7  dbms_output.put_line('create table '||l_tablename||l_get_data||l_from_table);
  8  execute immediate 'create table '||l_tablename||l_get_data||l_from_table;
  9  end;
 10  /

Procedure created.

SQL>
SQL>
SQL> set serverout on
SQL> execute asu_p_build_table_name('FTEST1_', ' as select * from ', 'abc.pxr95ef;');
create table FTEST1_20160714 as select * from abc.pxr95ef;
BEGIN asu_p_build_table_name('FTEST1_', ' as select * from ', 'abc.pxr95ef;'); END;

*
ERROR at line 1:
ORA-00933: SQL command not properly ended
ORA-06512: at "MCDONAC.ASU_P_BUILD_TABLE_NAME", line 8
ORA-06512: at line 1


末尾的分号是 * 不是 * SQL,它是TOAD (或SQL Plus) 的信号,您现在可以 * 运行 * 此命令。因此,您不需要PLSQL。

SQL> set serverout on
SQL> execute asu_p_build_table_name('FTEST1_', ' as select * from ', 'dual');
create table FTEST1_20160714 as select * from dual

PL/SQL procedure successfully completed.


希望这有所帮助。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论