请各位仁兄帮小妹BUG一下,哪出了问题?

Strawberry79 2003-02-27 06:37:52
在ASP里调ORACLE包里的存储过程的问题:
包定义如下:
CREATE OR REPLACE PACKAGE nb_supFind
AS
TYPE myrctype IS REF CURSOR;

PROCEDURE RecSel(p_StartDate IN VIEW_NB_TYGL.YY%TYPE,
p_EndDate IN VIEW_NB_TYGL.YY%TYPE,
p_Region IN VARCHAR2,
p_flag IN NUMBER,
p_col IN VARCHAR2,
p_table IN VARCHAR2,
v_ADDV OUT myrctype
);
END nb_supFind;
CREATE OR REPLACE PACKAGE BODY nb_supFind
AS

PROCEDURE RecSel(
p_StartDate IN VIEW_NB_TYGL.YY%TYPE,
p_EndDate IN VIEW_NB_TYGL.YY%TYPE,
p_Region IN VARCHAR2, --分区内容
p_flag IN NUMBER, --标识是行政区/二级区/三级区
p_col IN VARCHAR2, --选中项目名
p_table IN VARCHAR2, --操作表名
v_Result OUT myrctype --作为输出的游标
) IS

strsql VARCHAR2(500);

BEGIN
IF p_flag = 1 then
if p_Region = '' then
strsql:='SELECT ADDVNM,YY,SUM('||p_col||')
FROM '||p_table||
'WHERE YY <= '||p_EndDate||' AND YY>='|| p_StartDate||' AND ADDVNM = '||p_Region||' GROUP BY ADDVNM,YY';
else
strsql:='SELECT ADDVNM,YY,SUM('||p_col||')
FROM '||p_table||
'WHERE YY <= '||p_EndDate||' AND YY>='|| p_StartDate||'
GROUP BY ADDVNM,YY';
end if;
--打开动态游标
OPEN v_ADDV FOR strsql;
END IF;
END RecSel;
END nb_supFind;
已编译通过,无问题!

在ASP中调用:
Set CMD=Server.CreateObject("ADODB.Command")
CMD.ActiveConnection = Session("conn")
CMD.CommandType = adCmdText
CMD.CommandTimeout = 0
CMD.Prepared = true

CMD.CommandText = "{call nb_supFind.RecSel(?,?,?,?,?,?,?,{resultset 100,v_ADDV})}"

'输入变量赋值
CMD.Parameters.Append CMD.CreateParameter(p_StartDate,adVarChar,adParamInput,4,StartYr)'开始年份
CMD.Parameters.Append CMD.CreateParameter(p_EndDate,adVarChar,adParamInput,4,EndYr) '结束年份
CMD.Parameters.Append CMD.CreateParameter(p_Region,adVarChar,adParamInput,20,Addv) '行政区名
CMD.Parameters.Append CMD.CreateParameter(p_flag,adInteger,adParamInput,,1) '标识分区
CMD.Parameters.Append CMD.CreateParameter(p_col,adVarChar,adParamInput,100,Item) '选中项目名
CMD.Parameters.Append CMD.CreateParameter(p_table,adVarChar,adParamInput,50,Tname) '得到表名

rs.CursorType = 0
rs.CursorLocation = 2
rs.LockType = 3
set rs.Source = CMD

rs.Open()


错误类型:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
rs.Open()错

不知道是我包里有错,还是ASP里调用错?苦恼:(


...全文
35 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
beckhambobo 2003-02-28
  • 打赏
  • 举报
回复
1、首先要确定p_StartDate,p_EndDate 两个数据类型
2、再次要看VIEW_NB_QSXK的数据类型,desc VIEW_NB_QSXK;
3、最后,command对象增加参数类型不是以存储过程参数的类型,以表结格的定义类型所参照
例如,p_Region varchar2(20);那么应表示以下
CMD.Parameters.Append CMD.CreateParameter("p_Region",200,1,20,2000)
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
我上面贴的包改了些小错误,下面是在SQLPLUS里调试部分,已经可以显示结果
set serveroutput on
DECLARE
p_rc NB_SUPFIND.myrctype;
str varchar2(50);
BEGIN
NB_SUPFIND.RecSel('2000','2000','北京',1,'YSQ_SL','VIEW_NB_QSXK',p_rc);
LOOP
FETCH p_rc INTO str;
DBMS_OUTPUT.PUT_LINE(str);
EXIT WHEN p_rc%NOTFOUND;
END LOOP;
END;
结果如下
北京
北京

现在在ASP里:
StartYr = request("StartYr") 已经测试,绝对有值
??CMD.Parameters.Append CMD.CreateParameter("p_StartDate",200,1,,StartYr)'开始年份
这句报错
ADODB.Parameters (0x800A0E7C)
(我想我传的参数肯定有问题,要是变量这样写还不行吗?)
注掉之后
set rs=CMD.Execute 又报错:(

(千思百想不得其解,等待中。。。)
beckhambobo 2003-02-28
  • 打赏
  • 举报
回复
这里不可能,意思是不放记录集,输入参数是对应存储过程个数.
CMD.CommandText = "{call nb_supFind.RecSel(?,?,?,?,?)}"//过程中有五个参数,要对应.

'CMD.Parameters.Append CMD.CreateParameter("p_EndDate",200,1,,EndYr)//EndYr在那得出?request("endyr")
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
我用的也是ODBC驱动:
Set Conn=Server.CreateObject("ADODB.Connection")
Set Rs = Server.CreateObject("ADODB.Recordset")
conn.Open Session("connstr")

Set CMD=Server.CreateObject("ADODB.Command")
CMD.ActiveConnection = conn

'CMD.CommandText = "{call nb_supFind.RecSel(?,?,?,?,?,?,?,{resultset 100,myrctype})}"
CMD.CommandText = "{call nb_supFind.RecSel(?)}"
(两名全试,还是不行)

'输入变量赋值
'CMD.Parameters.Append CMD.CreateParameter("p_StartDate",200,1,,2000) '开始年份
'CMD.Parameters.Append CMD.CreateParameter("p_EndDate",200,1,,EndYr) '结束年份
'CMD.Parameters.Append CMD.CreateParameter("p_Region",200,1,,Addv) '行政区名
CMD.Parameters.Append CMD.CreateParameter("p_flag",3,1,,1) '标识分区
'CMD.Parameters.Append CMD.CreateParameter("p_col",200,1,,Item) '选中项目名
'CMD.Parameters.Append CMD.CreateParameter("p_table",200,1,,Tname) '得到表名
字符型的变参暂时全部注掉,就剩下第四条应该没错了吧?

set rs.Source = CMD
'set rs=CMD.Execute
rs.Open() ???晕,这句还是错:~(

参看beckhambobo兄指点的若干文档,修改结果如上,还是不对,为什么~~~~~?

(女人不能写程序,不能来CSDN呀!男女平等~~~:))
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
这世道真假女的都难以分清了,我不是装的:(
alan990699 2003-02-28
  • 打赏
  • 举报
回复
学习
(不过也用不着装成女孩子来骗取各位单身大侠的同情吧,呵呵:))
beckhambobo 2003-02-28
  • 打赏
  • 举报
回复
可以参考如下:
http://expert.csdn.net/Expert/topic/1180/1180654.xml?temp=.4250147

以下是在asp参数对照表
var adEmpty = 0;
var adTinyInt = 16;
var adSmallInt = 2;
var adInteger = 3;
var adBigInt = 20;
var adUnsignedTinyInt = 17;
var adUnsignedSmallInt = 18;
var adUnsignedInt = 19;
var adUnsignedBigInt = 21;
var adSingle = 4;
var adDouble = 5;
var adCurrency = 6;
var adDecimal = 14;
var adNumeric = 131;
var adBoolean = 11;
var adError = 10;
var adUserDefined = 132;
var adVariant = 12;
var adIDispatch = 9;
var adIUnknown = 13;
var adGUID = 72;
var adDate = 7;
var adDBDate = 133;
var adDBTime = 134;
var adDBTimeStamp = 135;
var adBSTR = 8;
var adChar = 129;
var adVarChar = 200;
var adLongVarChar = 201;
var adWChar = 130;
var adVarWChar = 202;
var adLongVarWChar = 203;
var adBinary = 128;
var adVarBinary = 204;
var adLongVarBinary = 205;
var adChapter = 136;
var adFileTime = 64;
var adDBFileTime = 137;
var adPropVariant = 138;
var adVarNumeric = 139;

至于call pkg_test.get(?)}" 是我自已不断测试出来的结果,初时也是按照标准做法,但总是不成功,后来才发现之样才成功。而输出的类型是所定义的类型,不能直接具体到变量名称.

还要提出一点,我用的是odbc驱动,是否与连接字符串有关,这方面我也会继续测试。
提供不同的连接字符串:
1、Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=timecard;Data Source=bosweb;Extended Properties=""

2、Provider=MSDAORA;Password=timecard;User ID=timecard;Data Source=bosweb
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
TO beckhambobo(beckham) :
特感激你能那么仔细读我写的天书,还有点疑问,麻烦再看一下:)

Q1:以下例子网上找的:

SQLstr = {CALL forum_retrieve.getforums({resultset 10,forumname,thecount})}

  ‘建立存储过程调用字符串。其中forum_retrieve.

  ‘getforums说明是调用forum_retrieve包中的getforums

  ‘存储过程,forumname、thecount是存储过程的输出变量,

在这里forumname、thecount是包里定义的输出变量,要是我把v_ADDV 要改为myrctype
那不成了输出类型而不是变量了吗?
你的例子里cm1.CommandText = "{call pkg_test.get(?)}" 这样也能搞定吗?不用定义输出变量吗?

Q2:set para = cm1.Parameters
para.Append cm1.CreateParameter("p_id",3,1,,1)
如果我的输入参数是变量该怎么写?

谢谢!:)
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
真是不好意思,今天下班前要是还解决不了问题,我也结贴给分~ 大恩无以为报:(
下周再给分接着问:) 呵呵
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
这句是行了!

终于又到了这一亲爱的执行语句set rs=CMD.Execute 还有错:~~( why ???

错误类型:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)

快服了~ 什么邮件?
snowy_howe 2003-02-28
  • 打赏
  • 举报
回复
beckhambobo(beckham)兄弟辛苦了,呵呵。
beckhambobo 2003-02-28
  • 打赏
  • 举报
回复
'SELECT ADDVNM,YY,SUM('||p_col||') 这一句中,p_col是一字符类型,不是对应字段类型
,所以和p_table相同设置,应该可以。

设置成功后给一个邮件,要备份数据
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
p_table过去了!:)

p_col 用过了:
var adNumeric = 131;
CMD.Parameters.Append CMD.CreateParameter("p_col",131,1,10,Item) 不行
var adSingle = 4;
CMD.Parameters.Append CMD.CreateParameter("p_col",4,1,10,Item) 不行
var adDouble = 5;
CMD.Parameters.Append CMD.CreateParameter("p_col",5,1,10,Item) 不行
var adVarNumeric = 139;
CMD.Parameters.Append CMD.CreateParameter("p_col",139,1,10,Item) 不行

beckhambobo兄你说我还能用哪个类型呢?数据库里它所对应的列都是number(10,2)的,是不是我传参的时候长度给的不对?省略肯定不行,可写什么呢?



beckhambobo 2003-02-28
  • 打赏
  • 举报
回复
对,p_col要对应所在的列名的类型与长度
至于p_table定义它为字符类型,给它足够长度,或者为空,看情况如何。

给我一个回复。
Strawberry79 2003-02-28
  • 打赏
  • 举报
回复
续传参问题:
包中定义:
strsql:='SELECT ADDVNM,YY,SUM('||p_col||')
FROM '||p_table||
' WHERE YY <= TO_NUMBER('||p_EndDate||') AND YY>=TO_NUMBER('|| p_StartDate||') AND ADDVNM='''||p_Region||
''' GROUP BY ADDVNM,YY';

在ASP里前面的参数都过去了,到下面这两句死活过不去:

CMD.Parameters.Append CMD.CreateParameter("p_col",200,1,,Item) CMD.Parameters.Append CMD.CreateParameter("p_table",200,1,,Tname)

p_col是要选的列名,p_table表名 在VIEW_NB_QSXK中没有它们的定义,是不是就要近过程里的定义传了呢?视图中预选列为NUMBER(10,2)型,我在传p_col时要传什么类型,什么类型都试了,就是过不去!:(

beckhambobo 2003-02-27
  • 打赏
  • 举报
回复
CREATE OR REPLACE PACKAGE pkg_test
AS
TYPE myrctype IS REF CURSOR;

PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);
END pkg_test;
/

CREATE OR REPLACE PACKAGE BODY pkg_test
AS
PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)
IS
sqlstr VARCHAR2 (500);
BEGIN
IF p_id = 0 THEN
OPEN p_rc FOR
SELECT ID, NAME, sex, address, postcode, birthday
FROM student;
ELSE
sqlstr :=
'select id,name,sex,address,postcode,birthday
from student where id=:w_id';
OPEN p_rc FOR sqlstr USING p_id;
END IF;
END get;
END pkg_test;
/

<%@LANGUAGE="VBSCRIPT"%>
<!--#include file="Connections/conn.asp" -->
<%
set cm1 = Server.CreateObject("ADODB.Command")
cm1.ActiveConnection = MM_conn_STRING
cm1.CommandType = 1
cm1.CommandTimeout = 0
cm1.Prepared = true
cm1.CommandText = "{call pkg_test.get(?)}"
set para = cm1.Parameters
para.Append cm1.CreateParameter("p_id",3,1,,1) --最后一位是数字型,为1值.3代表number,1代表adparaminput,空的位置说明没范围

set rs = Server.CreateObject("ADODB.Recordset")

set rs=cm1.Execute
%>
beckhambobo 2003-02-27
  • 打赏
  • 举报
回复
那你首先测试包中能否正确使用,可以在oracle完成测试,那不然问题会越来越多.

发现一处细微的错误,包头与包体中声明游标变量出现两个名字(不统一),当然会报错
包头中:
v_ADDV OUT myrctype
包体中:
v_Result OUT myrctype

把它们改为统一名字

另外:
CMD.CommandText = "{call nb_supFind.RecSel(?,?,?,?,?,?,?,{resultset 100,v_ADDV})}"
v_ADDV 要改为myrctype

还有
rs要声明为对象才可用
set rs = Server.CreateObject("ADODB.Recordset")

以下一大堆都有错:
CMD.Parameters.Append CMD.CreateParameter(p_StartDate,adVarChar,adParamInput,4,StartYr)'开始年份
CMD.Parameters.Append CMD.CreateParameter(p_EndDate,adVarChar,adParamInput,4,EndYr) '结束年份
CMD.Parameters.Append CMD.CreateParameter(p_Region,adVarChar,adParamInput,20,Addv) '行政区名
CMD.Parameters.Append CMD.CreateParameter(p_flag,adInteger,adParamInput,,1) '标识分区
CMD.Parameters.Append CMD.CreateParameter(p_col,adVarChar,adParamInput,100,Item) '选中项目名
CMD.Parameters.Append CMD.CreateParameter(p_table,adVarChar,adParamInput,50,Tname) '得到表名
command对象增加参数的用法有误,是这样的最后一位是值.
jiezhi 2003-02-27
  • 打赏
  • 举报
回复
调试的办法就是要跟踪看到底哪里出错了,
编译虽然通过,但你可以在sqlplus里测试一下你写的oracle过程。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧