如题,其实是个典型的问题,网上查到的方法一般是动态拼接SQL语句执行,但现在我的SQL太长了,全部动态执行很难阅读,对于以后维护也很麻烦。
我有一个想法就是把动态的部分数据先查找出来,放到临时表或者游标什么的上面,或者是动态创建一个视图。但试过都不成功。不知道有没有人遇到过类似情况???又怎么样解决?

解决方案 »

  1.   

    弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句
      

  2.   

    在function里面,return ref cursor
      

  3.   

    SQL人人拼,易不易读靠自己。你完全可以在拼sql的时候把书写格式写成你易读的, 把拼接结果也写成你易读的动态表名,不好意思只能用拼接否则你只能,根据动态表的个数 写N个表名不同的sql。
      

  4.   

    其实主要差别就是拼接的时候,变量要
    'where a='''||变量||''' and 其他字符串'||但是直接写的时候变量周围不需要引号也不需要||连接
      

  5.   


    sql_str := 'SELECT A.id   '||chr(13)||
               '       A.name '||chr(13)||
               ' FROM  A      '||chr(13)||
               ' WHERE A.ID = '||chr(39)||变量1||||chr(39);
    --这有什么不好读的?
      

  6.   

    那如果客户的需要又变了,另外又要连接多一张表进行查询,那你又怎么样可以快速地更改SQL进行测试?而不是等到存储过程在执行的过程中,查看变量再把语句提取才能看到才修改呢
      

  7.   

    呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。情景就类似于这样吧 http://zhidao.baidu.com/question/489664010.html
      

  8.   


    begin 
        str_sql:=create table ||table_name||(||field1|| ||datatype1||,||field2|| ||datatype2||);
        execute immediate str_sql;   --动态执行DDL语句
        exception 
            when others then 
                null;
    end ;