CREATE OR REPLACE PROCEDURE QUERY(AA VARCHAR2(1000), BB NUMBER(10), CC NUMBER(10)) IS V_STR : VARCHAR2(1000); BEGIN V_STR := AA || ' AND (ROWMUN >=' || TO_CHAR(BB) || ' AND ROWNUM <= ' || TO_CHAR(CC) || ') '; EXECUTE IMMEDIATE V_STR; END QUERY; 关键是 EXECUTE IMMEDIATE 是执行一个字符串, 这个字符串中是一个查询语句, 你自己扩展一下
麻烦了,要用包,csdn上有很多例子
学习,to leborety(那只螃蟹),麻烦你能贴上一个例子的链接吗
--预先在包或库中定义对象 TYPE T_TOTAL_DATA IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER; --在包中写如下函数 CREATE OR REPLACE FUNCTION QUERY(AA VARCHAR2(1000), BB NUMBER(10), CC NUMBER(10)) RETURN T_TOTAL_DATA IS V_STR : VARCHAR2(1000); IT_DATA T_TOTAL_DATA; a number(3):=1; type cur_type is ref cursor; --定义默认游标类型 TYPE rec_type IS RECORD ( sqlstr varchar2(1000), num_no NUMBER(3)); rec rec_type; BEGIN V_STR := AA || ' AND (ROWMUN >=' || TO_CHAR(BB) || ' AND ROWNUM <= ' || TO_CHAR(CC) || ') '; -- EXECUTE IMMEDIATE V_STR; FOR I IN (1.. (CC-BB)) LOOP IT_DATA(I):=''; END LOOP;OPEN cur_Getval FOR V_STR ; LOOP Fetch cur_Getval into rec.sqlstr,rec.num_no; exit when cur_Getval%notfound; IT_DATA(a) :=rec.sqlstr;RETURN IT_DATA; END ;未经测试,意在提供思路.
hrui99(助人为本,潜水为行) 的方法是可行的,不过V_STR := AA || ' AND (ROWMUN >=' || TO_CHAR(BB) || ' AND ROWNUM <= ' || TO_CHAR(CC) || ') '; 语句是查不出结果的,因为ROWNUM是一个伪列,当ROWNUM > 一个数时,如果这个数是大于等于1的数,此表达式返回FALSE,也就是如果BB为一个大于等于1的数,你得到的结果永远是空,你可以改造一下,得到你的结果
V_STR : VARCHAR2(1000);
BEGIN
V_STR := AA || ' AND (ROWMUN >=' || TO_CHAR(BB) || ' AND ROWNUM <= ' || TO_CHAR(CC) || ') ';
EXECUTE IMMEDIATE V_STR;
END QUERY;
关键是
EXECUTE IMMEDIATE 是执行一个字符串, 这个字符串中是一个查询语句, 你自己扩展一下
TYPE T_TOTAL_DATA IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER;
--在包中写如下函数
CREATE OR REPLACE FUNCTION QUERY(AA VARCHAR2(1000), BB NUMBER(10), CC NUMBER(10)) RETURN T_TOTAL_DATA
IS
V_STR : VARCHAR2(1000);
IT_DATA T_TOTAL_DATA;
a number(3):=1;
type cur_type is ref cursor; --定义默认游标类型
TYPE rec_type IS RECORD (
sqlstr varchar2(1000),
num_no NUMBER(3));
rec rec_type;
BEGIN
V_STR := AA || ' AND (ROWMUN >=' || TO_CHAR(BB) || ' AND ROWNUM <= ' || TO_CHAR(CC) || ') ';
-- EXECUTE IMMEDIATE V_STR;
FOR I IN (1.. (CC-BB))
LOOP
IT_DATA(I):='';
END LOOP;OPEN cur_Getval FOR V_STR ;
LOOP
Fetch cur_Getval into rec.sqlstr,rec.num_no;
exit when cur_Getval%notfound;
IT_DATA(a) :=rec.sqlstr;RETURN IT_DATA;
END ;未经测试,意在提供思路.
语句是查不出结果的,因为ROWNUM是一个伪列,当ROWNUM > 一个数时,如果这个数是大于等于1的数,此表达式返回FALSE,也就是如果BB为一个大于等于1的数,你得到的结果永远是空,你可以改造一下,得到你的结果