CREATE OR REPLACE PROCEDURE Show_Xml(
   p_TableName  VARCHAR2, //接表名
   p_levelID VARCHAR2 ,   //接字段名
   p_ShowID  VARCHAR2 ,   //接字段名
   p_ShowName   VARCHAR2,
   p_KeyValue   VARCHAR2
   ) AS   cursor c_temp is 
   select p_levelID ,p_ShowID from 
   p_TableName;
-------
想写这样一个存储过程,行参送表名和两个字段名字,然后把查询结果给游标。
这样应该不行,编译时提示没有字段名和表名。不知道有没有变通的方法,谢谢大家拉!!

解决方案 »

  1.   

    表名做参数传入过程的例子
    create or replace procedure test(table_name in varchar2)
    as
      type mycursor is ref cursor;
      cursor_tbname mycursor;
      sqlstr varchar2(500);
    begin
      sqlstr := 'select * from '||table_name;
      open cursor_tbname for sqlstr;
      close cursor_tbname;
    end;
    /
      

  2.   

    CREATE OR REPLACE PROCEDURE Show_Xml(
       p_TableName  VARCHAR2,
       p_levelID VARCHAR2 ,
       p_ShowID  VARCHAR2 ,
       p_ShowName   VARCHAR2,
       p_KeyValue   VARCHAR2   
    ) AS   v_marige1 varchar2(20);
       v_marige2 varchar2(60);
       sqlstr varchar2(500);
       
       TYPE  mycursor IS  REF  CURSOR ;
       c_temp mycursor;
          BEGIN   
       sqlstr := 'select'||' '||p_levelID||','||p_ShowID||' from '||' '||p_TableName;
       dbms_output.put_line(' <standard name="'||p_ShowName||'" range="user" keyValue="'||p_KeyValue||'" groupID="basic">');
       open c_temp FOR sqlstr;
       loop fetch c_temp into   
       v_marige1,
       v_marige2;   dbms_output.put_line(' <cate level="'||v_marige1||'"'||'codeID="000" showLabel="'||v_marige2||'"'
       ||'range="system"'||'corpID="001" publicTag="1" validTag="1"/>');
      
       exit when c_temp%notfound;
       end loop;
       close c_temp;
       dbms_output.put_line('</standard>');
    end Show_Xml;
    -------------------
    TO:ATGC(想到南极去看看飞翔的海鸥) 
    谢谢啊,已经成功了。上面是我代码
    不过还想请教一个问题,声明变量的时候可否取表字段的类型
    比如:以前是这样写 v_marige2 varchar2(60)
    可否写成这样效果的 v_marige1  p_TableName.p_levelID%type;
                       v_marige2  p_TableName.p_ShowID%type;
      

  3.   

    我的意思是直接写成 v_marige1  p_TableName.p_levelID%type; 会报错
    p_TableName 和p_levelID 都是行参 
    所以请教 达到这样的效果 应该怎么写
      

  4.   

    1  create or replace procedure gg(nn in aa.name%type)
      2  as
      3  begin
      4  null;
      5* end;
    SQL> /过程已创建。
      

  5.   

    可能我表达不是很清楚
    我不是要定义行参数类型是某一个确已确定表字段的类型我这个存储过程定义行参是接收传送过来的表的名字和字段的名字,这个应该没什么问题
    下一步,声明一个变量, 这个变量的的类型是行参接收的表字段类型
    -------
    CREATE OR REPLACE PROCEDURE Show_Xml(
       p_TableName  VARCHAR2, //接收表名
       p_levelID VARCHAR2 ,  //接收字段名字
       p_ShowID  VARCHAR2 ,  //接收字段名,传入的两个字段都是属于表 p_TableName的
       p_ShowName   VARCHAR2,
       p_KeyValue   VARCHAR2   
    ) AS   v_marige1 varchar2(20);
       v_marige2 varchar2(60);
     也是就是申明 v_marige1的时候,v_marige1的类型是可否为 p_TableName对应表的字段的类型
     因为p_TableName存放的是表名,p_levelID和p_ShowID 存放字段名字,可以保证p_levelID和p_ShowID 接收的字段都是属于p_TableName对应表。
      

  6.   

    那你要到数据字典里select一下,看看接受的是不是合法字段名
    这个你说的好像和数据类型无关
    好像是要保证接收一个正确的字段名称
      

  7.   

    我的主要想法是 申明v_marige1变量的时候 它的类型可否是动态的
    即:确定它的类型是行参接收的表名以及字段名
        比如我传入 Show_Xml('table1','field1','field2')
                   Show_Xml('table2','field3','field4')
        说明:table1 ,table2是表名 field1,field2是字段名属table1 
                                 'field3','field4'是字段名称属table2
     
     申明 v_marige1  p_TableName.p_levelID%type; 
    (TableName是行参,对应-table1或者table2 ;p_levelID为行参,对应-field1或者field3)。这样写肯定是错误的,不知道如何写,就这样表达。         
     
     假设 field1类型为varchar2(20) 那    v_marige1 为 varchar2(20)
     假设 field3类型为varchar2(100) 那    v_marige1 为 varchar2(100)