将select语句插入表-ORA-06502

时间:2013-01-08 01:00:37

标签: sql plsql oracle11g

我有6个测试环境和1个生产环境。我创建了几个不同的报告作为Oracle视图,并且需要一种在环境之间同步这些报告的方法。

我正在尝试创建一个我可以运行的脚本,它基本上会输出一个命令列表,我可以将其复制并粘贴到我的不同环境中,以创建必要的视图/公共同义词和权限。

我必须将结果文本放入数据库表中,因为dbms_output.put_line对它可以显示的字符数有一定的限制。

我有以下内容,但如果我尝试插入数据,我会得到ORA-06502: PL/SQL: numeric or value error。我猜这可能与字符文字没有被转义有什么关系。

CREATE OR REPLACE PROCEDURE EXPORT_REPORTS AS
  statements CLOB;
  tmp_statement CLOB;


  CURSOR all_views IS
     SELECT
      OWNER,
      VIEW_NAME,
      TEXT
    FROM
      ALL_VIEWS
    WHERE
      OWNER = 'PAS'
  ;
BEGIN
  FOR v IN all_views LOOP
    tmp_statement := 'CREATE OR REPLACE FORCE VIEW "' || v.OWNER || '"."' || v.VIEW_NAME || '" AS ' || CHR(13) || CHR(10) || v.TEXT;
    statements := statements || tmp_statement;
  END LOOP;
  EXECUTE IMMEDIATE 'INSERT INTO VIEW_EXPORTS VALUES ('''|| statements || ''')';
END EXPORT_REPORTS;

知道我可以做些什么来尝试解决这个问题? 如果是因为statements变量中的某些文本包含单引号,那么在将数据插入表之前如何才能将其转义?

2 个答案:

答案 0 :(得分:0)

这听起来像Data Pump的工作。

Oracle数据泵技术可以将数据和元数据从一个数据库高速移动到另一个数据库。

http://docs.oracle.com/cd/B28359_01/server.111/b28319/dp_overview.htm

为了获取数据库对象DDL,我建议使用DBMS_METADATA包。

http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_metada.htm#BGBDJAHH

答案 1 :(得分:-1)

您不能将CLOB用作局部变量的数据类型。请改用VARCHAR