凤梨吖 2019-11-15 14:25 采纳率: 0%
浏览 422

create table语句在存储过程中报错?

使用listagg函数拼接了动态建表语句:

 SELECT listagg(n.create_tab, ' ') WITHIN GROUP(ORDER BY ROWNUM DESC) NAME,
           i_id as id
      FROM (Select 'create Table ' || Tab_Name || ' ( ' || Tab_Body || ');' ||
                   chr(10) As Create_Tab
              From (Select Tab_Name,
                           tab_cn_name,
                           Listagg(Tab_Body) Within Group(Order By index_id) As Tab_Body
                      From (Select a.en_name As Tab_Name,
                                   a.chn_name As tab_cn_name,
                                   b.en_name || ' ' || b.data_type || Case
                                     When b.index_id < A1.Max_Id Then
                                      ',' || chr(10)
                                     Else
                                      ''
                                   End As Tab_Body,
                                   b.index_id,
                                   'comment on Table ' || a.en_name || ' is ' ||
                                   a.chn_name || ''';' as tab_comments,
                                   'comment on Column ' || a.en_name || '.' ||
                                   b.en_name || ' is ''' || b.chn_name ||
                                   ''';' as col_comments
                              From dmp.t_ds_model a --Table
                             Inner Join (Select count(*) As Max_Id, a.parent_id
                                          From dmp.t_ds_model a
                                         Where a.class_code = 'Column'
                                         group by a.parent_id) A1
                                On a.id = a1.parent_id
                              Left Join dmp.t_ds_model b --Column
                                On a.id = b.parent_id
                             Where b.class_code = 'Column'
                               AND a.id = i_id) --更改
                     Group By Tab_Name, tab_cn_name)
            union
            select 'comment on Table ' || T.En_Name || ' is ''' ||
                   t.chn_name || '''; ' || chr(10)
              from dmp.t_ds_model t
             where t.class_code = 'Table'
               AND t.id = i_id
            union
            select Listagg(col_comment) Within Group(Order By index_id) As com_body
              from (select 'comment on Column ' || t1.en_name || '.' ||
                           t2.en_name || ' is ''' || t2.chn_name || ''';' ||
                           CHR(10) as col_comment,
                           t2.index_id
                      from dmp.t_ds_model t1 --Table   
                     inner join dmp.t_ds_model t2 --Column
                        on t1.id = t2.parent_id
                     where t1.class_code = 'Table'
                       and t2.class_code = 'Column'
                       AND t1.id = i_id)) n;

之后使用execute immediate 运行建表语句:

select t.model_sql
    into v_sql
    from dmp.t_ds_model_sql t
   where t.model_id = i_id;
  execute immediate v_sql;

测试存储过程报错:
图片说明
把单独的建表语句在SQL窗口中执行可以正常执行。
求问大神这种情况要怎么改!??

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-11-15 17:14
    关注

    用 select v_sql; 输出一下sql,看看里面有没有缺少或多了标点符号

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮