你都自己构件好了,在里面运行不就知道了。 create procedure v_where2(where1 varchar2) is stat varchar2(100); begin stat:='select * from emp '||where1; execute immediate stat; end; / 不到这个语句行不行
我的意思是说我就直接这么写,比如v_where 为 where (id = '1') 而我的语句就是 select * from ms_test v_where; 这样有没有语法错误?
CREATE OR REPLACE PROCEDURE IM.pro_allclassselect_test (p_collegelist IN VARCHAR2,p_name IN VARCHAR2) IS v_substr varchar2(100); --子串长度根据程序需要修改 v_pos1 integer; v_pos2 integer; v_num integer; v_where varchar2(1000); --用于存储动态的where语句 v_save_class varchar2(400); --用于存储p_name对应的classpower sql_string varchar2(1500); --用于构造的SQL语句 BEGIN v_pos1 := 1; v_num := 1; v_where := ''; v_save_class := ''; sql_string := ''; select classpower INTO v_save_class FROM MS_POWER WHERE adminname = p_name; --得到需要分割的班级信息 WHILE (INSTR(p_collegelist,'.',v_pos1+1) <> 0) LOOP v_pos2 := INSTR(p_collegelist,'.',v_pos1+1); IF v_num = 1 THEN IF (INSTR(p_collegelist,'.',v_pos1,v_num) = 1) THEN v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-1); ELSE v_substr := SUBSTR(p_collegelist,v_pos1,v_pos2-1); END IF; ELSE v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-v_pos1-1); END IF; v_where := v_where ||'( where collegename ='||v_substr||') or'; --没有到最后,所以有or v_num := v_num + 1; v_pos1 := v_pos2; END LOOP; v_substr := SUBSTR(p_collegelist,v_pos1+1); IF v_save_class is null --如果班级的序列为空 THEN v_where := v_where ||'( where collegename ='||v_substr||')'; --到最后,还是没有or,因为没有了班级信息 ELSE v_where := v_where ||'( where collegename ='||v_substr||') or'; --到最后,还是有or,因为有了班级信息 END IF; IF v_save_class is not null --如果班级序列不为空 THEN v_pos1 := 1; --指针复位 v_num := 1; WHILE (INSTR(v_save_class,'.',v_pos1+1) <> 0) LOOP v_pos2 := INSTR(v_save_class,'.',v_pos1+1); IF v_num = 1 THEN IF (INSTR(v_save_class,'.',v_pos1,v_num) = 1) THEN v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-1); ELSE v_substr := SUBSTR(v_save_class,v_pos1,v_pos2-1); END IF; ELSE v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-v_pos1-1); END IF; v_where := v_where ||'( where classname ='||v_substr||') or'; --没有到最后,所以有or v_num := v_num + 1; v_pos1 := v_pos2; END LOOP; v_substr := SUBSTR(v_save_class,v_pos1+1); v_where := v_where ||'( where classname ='||v_substr||')'; --到最后,没有or END IF; --注意除去重复列,DISTINCT sql_string := 'SELECT DISTINCT * FROM MS_CLASSINFO' || v_where; --构件的sql语句 execute immediate sql_string; END pro_allclassselect_test;
create procedure v_where2(where1 varchar2)
is
stat varchar2(100);
begin
stat:='select * from emp '||where1;
execute immediate stat;
end;
/
不到这个语句行不行
而我的语句就是
select * from ms_test
v_where;
这样有没有语法错误?
IS
v_substr varchar2(100); --子串长度根据程序需要修改
v_pos1 integer;
v_pos2 integer;
v_num integer;
v_where varchar2(1000); --用于存储动态的where语句
v_save_class varchar2(400); --用于存储p_name对应的classpower
sql_string varchar2(1500); --用于构造的SQL语句
BEGIN
v_pos1 := 1;
v_num := 1;
v_where := '';
v_save_class := '';
sql_string := '';
select classpower INTO v_save_class FROM MS_POWER WHERE adminname = p_name; --得到需要分割的班级信息
WHILE (INSTR(p_collegelist,'.',v_pos1+1) <> 0) LOOP
v_pos2 := INSTR(p_collegelist,'.',v_pos1+1);
IF v_num = 1
THEN
IF (INSTR(p_collegelist,'.',v_pos1,v_num) = 1)
THEN
v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-1);
ELSE
v_substr := SUBSTR(p_collegelist,v_pos1,v_pos2-1);
END IF;
ELSE
v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-v_pos1-1);
END IF;
v_where := v_where ||'( where collegename ='||v_substr||') or'; --没有到最后,所以有or
v_num := v_num + 1;
v_pos1 := v_pos2;
END LOOP;
v_substr := SUBSTR(p_collegelist,v_pos1+1);
IF v_save_class is null --如果班级的序列为空
THEN
v_where := v_where ||'( where collegename ='||v_substr||')'; --到最后,还是没有or,因为没有了班级信息
ELSE
v_where := v_where ||'( where collegename ='||v_substr||') or'; --到最后,还是有or,因为有了班级信息
END IF;
IF v_save_class is not null --如果班级序列不为空
THEN
v_pos1 := 1; --指针复位
v_num := 1;
WHILE (INSTR(v_save_class,'.',v_pos1+1) <> 0) LOOP
v_pos2 := INSTR(v_save_class,'.',v_pos1+1);
IF v_num = 1
THEN
IF (INSTR(v_save_class,'.',v_pos1,v_num) = 1)
THEN
v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-1);
ELSE
v_substr := SUBSTR(v_save_class,v_pos1,v_pos2-1);
END IF;
ELSE
v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-v_pos1-1);
END IF;
v_where := v_where ||'( where classname ='||v_substr||') or'; --没有到最后,所以有or
v_num := v_num + 1;
v_pos1 := v_pos2;
END LOOP;
v_substr := SUBSTR(v_save_class,v_pos1+1);
v_where := v_where ||'( where classname ='||v_substr||')'; --到最后,没有or
END IF;
--注意除去重复列,DISTINCT
sql_string := 'SELECT DISTINCT * FROM MS_CLASSINFO' || v_where; --构件的sql语句
execute immediate sql_string;
END pro_allclassselect_test;
execute immediate sql_string;自己不是写出来了吗?还有什么问题?
CREATE OR REPLACE PROCEDURE IM.pro_allclassselect (p_collegelist IN VARCHAR2,p_name IN VARCHAR2,p_CURSOR OUT pro_allclassselect_PACKAGE.pro_allclassselect_CURSOR)
IS
v_substr varchar2(100); --子串长度根据程序需要修改
v_pos1 integer;
v_pos2 integer;
v_num integer;
v_where varchar2(1000); --用于存储动态的where语句
v_save_class varchar2(400); --用于存储p_name对应的classpower
sql_string varchar2(1500); --用于构造的SQL语句
BEGIN
v_pos1 := 1;
v_num := 1;
v_where := '';
v_save_class := '';
sql_string := '';
select classpower INTO v_save_class FROM MS_POWER WHERE adminname = p_name; --得到需要分割的班级信息
WHILE (INSTR(p_collegelist,'.',v_pos1+1) <> 0) LOOP
v_pos2 := INSTR(p_collegelist,'.',v_pos1+1);
IF v_num = 1
THEN
IF (INSTR(p_collegelist,'.',v_pos1,v_num) = 1)
THEN
v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-1);
ELSE
v_substr := SUBSTR(p_collegelist,v_pos1,v_pos2-1);
END IF;
ELSE
v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-v_pos1-1);
END IF;
v_where := v_where ||'(collegename ='''||v_substr||''') or'; --没有到最后,所以有or
v_num := v_num + 1;
v_pos1 := v_pos2;
END LOOP;
v_substr := SUBSTR(p_collegelist,v_pos1+1);
IF v_save_class is null --如果班级的序列为空
THEN
v_where := v_where ||'(collegename ='''||v_substr||''')'; --到最后,还是没有or,因为没有了班级信息
ELSE
v_where := v_where ||'(collegename ='''||v_substr||''') or'; --到最后,还是有or,因为有了班级信息
END IF;
IF v_save_class is not null --如果班级序列不为空
THEN
v_pos1 := 1; --指针复位
v_num := 1;
WHILE (INSTR(v_save_class,'.',v_pos1+1) <> 0) LOOP
v_pos2 := INSTR(v_save_class,'.',v_pos1+1);
IF v_num = 1
THEN
IF (INSTR(v_save_class,'.',v_pos1,v_num) = 1)
THEN
v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-1);
ELSE
v_substr := SUBSTR(v_save_class,v_pos1,v_pos2-1);
END IF;
ELSE
v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-v_pos1-1);
END IF;
v_where := v_where ||'(classname ='''||v_substr||''') or'; --没有到最后,所以有or
v_num := v_num + 1;
v_pos1 := v_pos2;
END LOOP;
v_substr := SUBSTR(v_save_class,v_pos1+1);
v_where := v_where ||'(classname ='''||v_substr||''')'; --到最后,没有or
END IF;
--注意除去重复列,DISTINCT
sql_string := 'OPEN p_CURSOR FOR SELECT DISTINCT * FROM MS_CLASSINFO WHERE' || v_where; --构件的sql语句
--dbms_output.PUT_LINE(sql_string); --bebug
execute immediate sql_string;
END pro_allclassselect;
sql_string := 'OPEN p_CURSOR FOR SELECT DISTINCT * FROM MS_CLASSINFO WHERE' || v_where; --构件的sql语句
--dbms_output.PUT_LINE(sql_string); --bebug
execute immediate sql_string;
sql_string := ...;
open cursor for sql_string;