提示用户在oracle中输入

时间:2015-08-12 04:47:46

标签: sql oracle plsql execute-immediate

如何使用SQLTools v1.6提示用户在oracle中输入?我尝试了以下PL / SQL块:

DECLARE 
 type tes_tab is table of test_table%rowtype;
 test_tab tes_tab;    
BEGIN

  execute immediate 'SELECT * FROM test_table WHERE memid=' || &MemID
       bulk collect into test_tab;

  for i in 1..test_tab.count 
  loop
    dbms_output.put_line(test_tab(i).memid || ' ' || test_tab(i).clmtype);
  end loop;

END;

在编译期间提示用户输入。但是,该值不能在select语句中使用。有没有其他方法可以实现我的目标。

该表包含852269条记录,其中包含一行memID的多行(我在这里提供了几行):

 MEMID       CLMTYPE   PAIDAMT   SERVICEDATE           PAIDDATE
----------- --------- --------- --------------------- ---------------------
 220000096   RX         77.22    06.05.2011 00:00:00   27.05.2011 00:00:00
 220000096   RX         77.22    04.02.2011 00:00:00   27.02.2011 00:00:00
 220000096   RX         93.36    01.01.2011 00:00:00   27.01.2011 00:00:00
 220000096   RX         15.07    09.08.2012 00:00:00   07.09.2012 00:00:00
 220000096   RX        105.52    06.01.2012 00:00:00   04.02.2012 00:00:00
 220000096   RX         93.36    02.03.2011 00:00:00   27.03.2011 00:00:00
 220000096   RX        105.52    09.11.2011 00:00:00   09.12.2011 00:00:00
 220000096   RX        105.52    10.03.2012 00:00:00   13.04.2012 00:00:00
 220000096   RX         50.52    06.04.2011 00:00:00   27.04.2011 00:00:00

1 个答案:

答案 0 :(得分:1)

对代码进行小修改

DECLARE 
  vblMemID test_table%rowtype;
BEGIN
  EXECUTE IMMEDIATE'SELECT * FROM test_table WHERE memid='||&MemID into vblMemID ;
dbms_output.put_line(vblMemID.column1_name||' '||vblMemID.column2_name);
END;

注意: Column1_name和column2_name表示您的表列名称。 如果您的选择查询只返回一行,则上述代码将起作用。如果它返回多行,我们必须使用另一种方法。如果您需要,我会发布该代码。

修改          如果select查询将返回多行,则以下代码将起作用。对于多行,我们必须在oracle中使用集合或sysref游标。

DECLARE 
 type tes_tab is table of test_table%rowtype;
test_tab tes_tab;
BEGIN

execute immediate 'SELECT * FROM test_table WHERE memid='||&MemID bulk collect into test_tab;

for i in 1..test_tab.count 
loop
dbms_output.put_line(test_tab(i).column1_name||' '||test_tab(i).column2_name);
end loop; 
END;