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;
-------
想写这样一个存储过程,行参送表名和两个字段名字,然后把查询结果给游标。
这样应该不行,编译时提示没有字段名和表名。不知道有没有变通的方法,谢谢大家拉!!
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;
-------
想写这样一个存储过程,行参送表名和两个字段名字,然后把查询结果给游标。
这样应该不行,编译时提示没有字段名和表名。不知道有没有变通的方法,谢谢大家拉!!
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;
/
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;
p_TableName 和p_levelID 都是行参
所以请教 达到这样的效果 应该怎么写
2 as
3 begin
4 null;
5* end;
SQL> /过程已创建。
我不是要定义行参数类型是某一个确已确定表字段的类型我这个存储过程定义行参是接收传送过来的表的名字和字段的名字,这个应该没什么问题
下一步,声明一个变量, 这个变量的的类型是行参接收的表字段类型
-------
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对应表。
这个你说的好像和数据类型无关
好像是要保证接收一个正确的字段名称
即:确定它的类型是行参接收的表名以及字段名
比如我传入 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)