我有个存储过程
create or replace procedure shop_sale_receive(
userAutoId IN number,
shopAutoId in number,
startDate in varchar2,
endDate in varchar2
)
as
sqls VARCHAR2(1000);
BEGIN
sqls:='select ORDER_T.CREATEDATE,
ORDER_T.ID,
ORDER_T.PAIDACCOUNT,
ORDER_T.CASH,
ORDER_T.CHEQUE,
ORDER_T.CREDIT,
ORDER_T.CHARGEUP,
ORDER_T.CURRENCYEXCHANGE,
ORDER_T.OTHERRECEIVE,
ORDER_T.STATUSID,
ORDER_T.REMARK,
ORDER_T.ORDERTYPE,
ORDER_T.CUSTOMERNAME
from ORDER_T where ORDER_T.ENABLE=1 and ORDER_T.shopAutoId='||shopAutoId||'
and ORDER_T.ORDERTYPE in ('||'''sale.receives'''||','||'''sale.receives.red'''||')
and ORDER_T.STATUS ='||'''ACCEPT''';
IF userAutoId!=0 THEN
sqls:=sqls||' and order_t.customerAutoId='||userAutoId;
END if;
dbms_output.put_line(startDate) ;
if startDate is not null then
sqls:=sqls||' and to_char(ORDER_T.createDate,'||'''yyyy-MM-dd'''||')>='||''''||startDate||'''';
end if;
if endDate is not null then
sqls:=sqls||' and to_char(ORDER_T.createDate,'||'''yyyy-MM-dd'''||')<='||'''' ||endDate||'''';
end if;
dbms_output.put_line(sqls);
EXECUTE IMMEDIATE sqls; //这句执行sql语句 但是执行了 怎么没有返回结果;
end;
create or replace procedure shop_sale_receive(
userAutoId IN number,
shopAutoId in number,
startDate in varchar2,
endDate in varchar2
)
as
sqls VARCHAR2(1000);
BEGIN
sqls:='select ORDER_T.CREATEDATE,
ORDER_T.ID,
ORDER_T.PAIDACCOUNT,
ORDER_T.CASH,
ORDER_T.CHEQUE,
ORDER_T.CREDIT,
ORDER_T.CHARGEUP,
ORDER_T.CURRENCYEXCHANGE,
ORDER_T.OTHERRECEIVE,
ORDER_T.STATUSID,
ORDER_T.REMARK,
ORDER_T.ORDERTYPE,
ORDER_T.CUSTOMERNAME
from ORDER_T where ORDER_T.ENABLE=1 and ORDER_T.shopAutoId='||shopAutoId||'
and ORDER_T.ORDERTYPE in ('||'''sale.receives'''||','||'''sale.receives.red'''||')
and ORDER_T.STATUS ='||'''ACCEPT''';
IF userAutoId!=0 THEN
sqls:=sqls||' and order_t.customerAutoId='||userAutoId;
END if;
dbms_output.put_line(startDate) ;
if startDate is not null then
sqls:=sqls||' and to_char(ORDER_T.createDate,'||'''yyyy-MM-dd'''||')>='||''''||startDate||'''';
end if;
if endDate is not null then
sqls:=sqls||' and to_char(ORDER_T.createDate,'||'''yyyy-MM-dd'''||')<='||'''' ||endDate||'''';
end if;
dbms_output.put_line(sqls);
EXECUTE IMMEDIATE sqls; //这句执行sql语句 但是执行了 怎么没有返回结果;
end;
解决方案 »
- 关于VC连接oracle的问题,急,急,急,急,急,急,急
- 有原先数据库中的几个dbf文件,如果恢复数据库 我是新手,对Oracle一点也不懂 急急急!!!!
- Oracle转义符号
- 存储过程问题
- oracle进程内存占用一直增加,达到1G左右的时候就会连接失败,监听进程死掉,或者CPU达到100%,如何解决?
- recover database until time怎么恢复不了数据
- oracle数据库操作
- oracle入门遇到的问题--listener
- 在c++的程序中调用SQL语句,出错?
- System.DllNotFoundException: 无法加载 DLL (oci.dll)。
- oracle插入语句错误
- 过程出现问题
例: 向Order表插入一条记录,返回其标识CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
END
END
存储过程中获得方法:DECLARE @o_buyerid int
DECLARE @o_id bigint
EXEC [nb_order_insert] @o_buyerid ,o_id bigint
@o_id int
)
AS
BEGIN
SET NOCOUNT ON;
SELECT o_id,o_buyerid FROM [Order]
WHERE o_id = @o_id
GO
存储过程中的获取方法
(1)、使用临时表的方法CREATE TABLE [dbo].[Temp](
[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)
INSERT [Temp] EXEC [nb_order_select] @o_id
– 这时 Temp 就是EXEC执行SELECT 后的结果集
SELECT * FROM [Temp]
DROP [Temp] — 删除临时表
(2)、速度不怎么样.(不推荐)SELECT * from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb_order_select’)
看你意思,应该是返回一个结果集,用ref cursor型传出参数返回之。
(r_cur OUT SYS_REFCURSOR)
IS
r_cur SYS_REFCURSOR;
BEGIN
OPEN r_cur FOR
SELECT EMPLOYEE, EMPLOYER,
STARTDATE, ENDDATE,
REGIONCODE, EID, VALUE, CURRENCY
FROM EMPLOYMENT;
END;
你看你给我说的用ref cursor 我在我的存储过程中 在后应该怎么写
set serveroutput on
userAutoId IN number,
shopAutoId in number,
startDate in varchar2,
endDate in varchar2,
r_cur out SYS_REFCURSOR
)
IS
sqls VARCHAR2(1000);
r_cur SYS_REFCURSOR;
BEGIN
sqls:='select ORDER_T.CREATEDATE,
ORDER_T.ID,
ORDER_T.PAIDACCOUNT,
ORDER_T.CASH,
ORDER_T.CHEQUE,
ORDER_T.CREDIT,
ORDER_T.CHARGEUP,
ORDER_T.CURRENCYEXCHANGE,
ORDER_T.OTHERRECEIVE,
ORDER_T.STATUSID,
ORDER_T.REMARK,
ORDER_T.ORDERTYPE,
ORDER_T.CUSTOMERNAME
from ORDER_T where ORDER_T.ENABLE=1 and ORDER_T.shopAutoId='||shopAutoId||'
and ORDER_T.ORDERTYPE in ('||'''sale.receives'''||','||'''sale.receives.red'''||')
and ORDER_T.STATUS ='||'''ACCEPT''';
IF userAutoId!=0 THEN
sqls:=sqls||' and order_t.customerAutoId='||userAutoId;
END if;
dbms_output.put_line(startDate) ;
if startDate is not null then
sqls:=sqls||' and to_char(ORDER_T.createDate,'||'''yyyy-MM-dd'''||')>='||''''||startDate||'''';
end if;
if endDate is not null then
sqls:=sqls||' and to_char(ORDER_T.createDate,'||'''yyyy-MM-dd'''||') <='||'''' ||endDate||'''';
end if; dbms_output.put_line(sqls);
open r_cur for sqls;
end;
这是个游标吧!
是不是还要声明个游标
我按楼上的加了一句.
但是报错说:必须声明 r_cur
PL/SQL:Compilaion unit analysis terminated
看看能帮我解决一下
userAutoId IN number,
shopAutoId in number,
startDate in varchar2,
endDate in varchar2,
r_cur out SYS_REFCURSOR
)
IS
sqls VARCHAR2(1000);
这里去掉 r_cur SYS_REFCURSOR;
sorry
在PLSQL里
是这样写的吧
begin
a out varchar2(1000);
shop_sale_receive(7105,shopAutoId =>311,startDate => '2009-12-1',endDate => '2009-
12-20',r_cur => a);
end有错
传参数 不知道传个什么类型进去
还有就是能不能就是我掉完成存储过程就显示数据
不要用 dbms_output.pint()这个函数去打印执行后的放回变量
PL/SQL有专门的调试窗口,你直接在其下面输入你的值,就OK了。
然后点击返回的游标,新窗口里自然有返回的结果集。
我给了个a sys_refcursor 执行了也什么也不出来
EXECUTE IMMEDIATE sqls; -->
execute immediate 'create or replace view view_tmp as '||sqls;执行完过程后查询select * from view_tmp
如果存储过程没有错,调用的时候,这样:
sqlplus命令行:
variable a refcursor;
exec shop_sale_receive(1,1,'20080101','20091231',:a);
print a;
即可看到结果。你可以把这段拿去试试看效果:drop table emp;
create table emp(A varchar2(10),B varchar2(10),C varchar2(10));
insert into emp values('1','1','1');
insert into emp values('2','2','2');
insert into emp values('3','3','3');commit;set serveroutput on--该存储过程根据 in 参数 i_A 查出表的 B列赋给out参数 o_B
create or replace procedure p_test_dym(
i_A in varchar2,
o_B out varchar2
)
as
begin
select B into o_B from emp where emp.A = i_A;
end;
/variable b varchar2(10);
exec p_test_dym('1',:b);
print b;
open r_cur for sqls; 这一句是做什么用的 打开游标 后面是什么意思啊 我想打印下看下 sqls 这个变量的sql语句执行了没
打印下查出来的东西
在给动态SQL拼接SQL时,为什么有时候是三个单引号? 我或许这么问比较清洗一点“拼接动态SQL时,怎么添加单引号?”。望多加指点,谢谢