我有一个查询语句,在视图是可以用的,是阿泰指导写的, 举例子: create or replace view test as select × from aaa where 重量 <50, 实际上视图比这个复杂多了, 然后我在VB里用TEST这个视图,但是视图用WRAP不能加密,但存储过程可以加密, 所以我把这个视图修改成存储过程,用这个存储过程返回像视图TEST这样的记录集, 请问这个存储过程该怎么写呢?
create table test1 --建立测试表 ( tname varchar2(10), tclass varchar2(10), tscore int );insert into test1 select '无念','一年级','98' from dual union all --插入测试数据 select '无缘','二年级','99' from dual union all select '无尘','三年级','95' from dual union all select '无法','四年级','59' from dual; commit; create or replace package tpk --包头 is type tcur is ref cursor; --定义返回的结果集 procedure t_p(t_name varchar2 , t_cur out tcur);--定义存储过程 end; /create or replace package body tpk --包体 is procedure t_p(t_name varchar2 , t_cur out tcur)--存储过程的实现 is begin open t_cur for select * from test1 where test1.tname =t_name;--游标记录结果集 end t_p; end tpk; /--在PL/SQL DEVELOPER里面测试一下吧,存储过程是在包体中的 调用存储过程要写包体的名称,例如tpk.t_p如此
CREATE OR REPLACE PROCEDURE userinfo_proc(i_address VARCHAR2, o_cur OUT SYS_REFCURSOR)
IS
sqlstr VARCHAR2(200); -- 定义变量,用以存放SQL语句
BEGIN
sqlstr := 'SELECT Id, Name, Sex, Age, Address FROM userinfo WHERE Address = :i_address'; -- 给SQL变量赋值,其中 :i_address 是绑定变量,以提高执行效率!
OPEN o_cur FOR sqlstr USING i_address; -- 给游标变量赋值
END;
/set serveroutput on;
var c_cur refcursor;
exec userinfo_proc('北京',:c_cur);
print c_cur;
不过你也可以写SQL来代替存储过程的啊,你如果不会用VB6来调用返回结果集的存储过程,那你还是直接写SQL而不必写存储过程吧。
——按你的情况,你也可以把存储过程的结果集合的数据写到数据库的临时表,然后你VB6直接读取临时表里面的数据就可以了~这个还是要看你的系统的业务规则来顶的~
存储过程不难啊,,,ORACLE跟SQL SERVER确实返回结果集的存储过程有点不一样,ORACLE必须建立一个包——包头和包体,包头是一些定义,包体是一些实现,返回在包头里面定义的游标,然后你在VB6里面调用这个游标结果集就可以了~
GOOGLE上面应该很多例子的,如果不懂,可以到VB下去问怎么调用。此
礼!
我有一个查询语句,在视图是可以用的,是阿泰指导写的, 举例子: create or replace view test as select × from aaa where 重量 <50, 实际上视图比这个复杂多了, 然后我在VB里用TEST这个视图,但是视图用WRAP不能加密,但存储过程可以加密, 所以我把这个视图修改成存储过程,用这个存储过程返回像视图TEST这样的记录集, 请问这个存储过程该怎么写呢?
create table test1 --建立测试表
(
tname varchar2(10),
tclass varchar2(10),
tscore int
);insert into test1 select '无念','一年级','98' from dual union all --插入测试数据
select '无缘','二年级','99' from dual union all
select '无尘','三年级','95' from dual union all
select '无法','四年级','59' from dual;
commit;
create or replace package tpk --包头
is
type tcur is ref cursor; --定义返回的结果集
procedure t_p(t_name varchar2 , t_cur out tcur);--定义存储过程
end;
/create or replace package body tpk --包体
is
procedure t_p(t_name varchar2 , t_cur out tcur)--存储过程的实现
is
begin
open t_cur for select * from test1 where test1.tname =t_name;--游标记录结果集
end t_p;
end tpk;
/--在PL/SQL DEVELOPER里面测试一下吧,存储过程是在包体中的 调用存储过程要写包体的名称,例如tpk.t_p如此
加密的意义不大,你只不过不想别人看到你的实现?现在制作报表,可以用制作报表的单独工具啊,水晶报表好像已经N年了吧——有很多出名的报表工具,以及ETL工具。利用这些平台来开发报表的话,可以省去很多存储过程的,而且可能效率上也会有提高。--不过不知道你要开发的是虾米样的报表,如果只是简单的,写几个SQL就可以了,根本不用加密啊,要加密啊在文本上对称加密读写就可以~~(ORACLE不知道有没有像SQL的视图加密),你也可以考虑把加密的SQL存放在数据库里面的。==方法很多吧,偶只是胡乱说一下,哈,希望对你有点帮助