如何使用列值作为选择表达式

时间:2019-11-27 20:40:30

标签: sql oracle plsql expression

有一个表,其中包含一个包含SQL选择表达式的列。请参见以下示例:

╔════╦════════╦═══════════════════════════════════════════╗
║ ID ║ Code   ║ Expression                                ║
║ 1  ║ B12321 ║ SELECT * FROM table WHERE code LIKE '%'   ║
║ 2  ║ A35525 ║ SELECT * FROM table WHERE code = '1234'   ║
║ 3  ║ C23213 ║ SELECT * FROM table WHERE code <> '%D'    ║
╚════╩════════╩═══════════════════════════════════════════╝

我想遍历Expression列,执行这些语句,然后将结果插入到另一个表中。这有可能吗?我找不到与此相关的问题。除此之外,我还读到了一个使用游标在表中循环的方法,但是关于它有很多消极的地方。

如果可能,您是否可以提供有关我所遇到问题的有用链接,或者甚至可以提供示例代码来完成此操作。

2 个答案:

答案 0 :(得分:0)

是的,可以使用动态SQL,其中将摘录code的冒号限定为:code,并使用如下所示的双循环:

SQL> desc tab2
Name       Type           
---------- -------------  
ID         VARCHAR2(20)                          
NAME       VARCHAR2(100) 

SQL> create table tab3( ID varchar2(20), name varchar2(50));

SQL> declare
    v_row       tab2%rowtype;   
    v_cursor    sys_refcursor;
begin
   for c in ( select ID, code, expression from tab1 ) 
   loop  
    open v_cursor for replace(c.expression,' code ',' :code ') using c.code;
    loop
        fetch v_cursor
         into  v_row;
       exit when v_cursor%notfound;
     insert into tab3 values( v_row.id,v_row.name );   
    end loop;  
    close v_cursor;
   end loop; 
end;   
/

其中tab2table列中的公用expression

答案 1 :(得分:0)

您需要动态SQL。由于您不希望返回任何数据,因此可以通过一个小的PL / SQL过程来实现:

val aggregatedDf = data.as(myEncoder)
  .groupByKey(_.group)
  .mapGroups((key, iter) => { 
    import sc.implicits._

    var data = iter.toSeq.toDf()
    val (trainData, testData) = data.randomSplit(Array(.9, .1))
    // then apply Regression
    .
    .
    .
    // Get prediction value and return it
    val predictionValue = model.transform(testData).first().getDouble(0)
    (key, predictionValue)
  })

或带有匿名屏蔽的临时存储:

create or replace procedure insert_by_code(in_code varchar2) as
begin
  for rec in (select expression from mytable where code = in_code) loop
    execute immediate 'insert into other_table ' || rec.expression;
    commit;
  end loop;
end insert_by_code;
相关问题