关于存储过程(200分)(200分)

  • 主题发起人 主题发起人 DelphiUser
  • 开始时间 开始时间
D

DelphiUser

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Interbase中写了个存储过程,对数据库进行了写操作。
在Interbase的Windows ISQL中调用,结果正常。
而在Delphi中,每次重新启动Interbase Server后在第一次调用的时候正常,
但第二次调用的时候,数据库的数据没有被更改。这是为什么?
我的存储过程:
CREATE PROCEDURE SET_STU_RIGHTS (
ID VARCHAR(6),
RIGHT0 VARCHAR(1),
RIGHT1 VARCHAR(1),
RIGHT2 VARCHAR(1),
RIGHT3 VARCHAR(1),
RIGHT4 VARCHAR(1),
RIGHT5 VARCHAR(1),
RIGHT6 VARCHAR(1),
RIGHT7 VARCHAR(1)
) AS
BEGIN
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 0, :RIGHT0;
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 1, :RIGHT1;
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 2, :RIGHT2;
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 3, :RIGHT3;
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 4, :RIGHT4;
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 5, :RIGHT5;
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 6, :RIGHT6;
EXECUTE PROCEDURE SET_STU_ONE_RIGHT :ID, 7, :RIGHT7;
END

CREATE PROCEDURE SET_STU_ONE_RIGHT (
ID VARCHAR(6),
RIGHTID SMALLINT,
ENABLE VARCHAR(1)
) AS
DECLARE VARIABLE Temp INTEGER;
BEGIN
SELECT COUNT(*) FROM STURIGHTS WHERE (ID=:ID) AND (RIGHTID=:RIGHTID) INTO :Temp;
IF ((Temp>0) AND (Enable='F')) THEN
BEGIN
DELETE FROM STURIGHTS WHERE (ID=:ID) AND (CLASSID=:RIGHTID);
EXIT;
END
IF ((Temp=0) AND (Enable='T')) THEN
BEGIN
INSERT INTO STURIGHTS(ID, RIGHTID)
VALUES (:ID, :RIGHTID);
END
END

 
执行语句呢?
另外, 换成query来execsql (sql='execute set_str_rights(...)')
看行不行.
 
我用的是TStoredProc;
procedure TCommisionDlg.Button1Click(Sender: TObject);
var
i,j:Integer;
begin
try
for j:=1 to 8 do dmMain.spSetFixRights.Params[j].asString:=N[j];//N为字符数组
dmMain.spSetFixRights.Prepare;
dmMain.spSetFixRights.ExecProc;
dmMain.spSetFixRights.UnPrepare;
except
raise Exception.Create('操作失败。');
end;
end;

我用TQuery试试看。
 
我还想问一下,我的存储过程对多个数据表进行了修改,如何让Delphi中刷新显示
呢?有没有什么地方可以设置?(除关闭后打开的方法外)
 
用TQuery一样的,没有效果。?
我用SQL Monitor看参数都传对了,但跟没有执行一样,也不出现异常。?
 
怎么没人响应?
 

IF ((Temp>0) AND (Enable='F')) THEN
BEGIN
DELETE FROM STURIGHTS WHERE (ID=:ID) AND (CLASSID=:RIGHTID);
EXIT;
END
IF ((Temp=0) AND (Enable='T')) THEN
BEGIN
INSERT INTO STURIGHTS(ID, RIGHTID)
VALUES (:ID, :RIGHTID);
END
是不是没写完?
新插入的一条的enable是空呀!
 
STURIGHTS结构:
ID 学生号
RightID权限号,权限号是从0到7

若StuRight中有记录(1,0),(1,2)表示学生1有权限0和权限2

IF ((Temp>0) AND (Enable='F')) THEN //如果第ID学生已授权RightID,并且要取消此权限
BEGIN
DELETE FROM STURIGHTS WHERE (ID=:ID) AND (RIGHTID=:RIGHTID);//删除第ID个学生的RightID权限。
EXIT;
END
IF ((Temp=0) AND (Enable='T')) THEN //如果第ID学生未授权RightID,并且要给他受RightID权
BEGIN
INSERT INTO STURIGHTS(ID, RIGHTID)
VALUES (:ID, :RIGHTID);//插入第ID学生的RightID权限
END
 
Set_STU_Rights是一次给学生ID受所有权限。
例如
Execute Procedure Set_Stu_Rights(1,'T','T','F','T','T','F','T','F');
表示给学生1受0,1,3,4,6的权限。

 
呵呵,
是我看错了,
把你两次的测试数据写出来看看。
 
我在ISQL中直接执行SQL结果是正确的,数据也被修改了。所以我想这不是SQL的问题
可能是Delphi中哪个地方要设置以下?(SQLMonitor中的显示信息也表明参数正确,
并且SET_STU_RIGHTS过程已被执行)
 
每次当我将某个学生的权限全部去掉(即EXECUTE PROCEDURE SET_STU_RISHTS('000001','F','F','F','F','F','F','F','F')后)
下次再授权,则能有效。
若学生权限没有被清空时,再授权,就出现了我所说的情况(等于没有执行)。
 
快去把<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=163393">这个</a>问题结束了吧;-)

IMPORTANT
Because each statement in a stored procedure body must be
terminated by a semicolon, you must define a different symbol to
terminate the CREATE PROCEDURE statement in isql. Use SET TERM before
CREATE PROCEDURE to specify a terminator other than a semicolon.
After the CREATE PROCEDURE statement, include another SET TERM to
change the terminator back to a semicolon.

给你个例子:
SET TERM !! ;
CREATE PROCEDURE VIEW_LANGS
RETURNS (code VARCHAR(5), grade SMALLINT, cty VARCHAR(15),
lang VARCHAR(15))
AS
DECLARE VARIABLE i INTEGER;
BEGIN
FOR SELECT JOB_CODE, JOB_GRADE, JOB_COUNTRY
FROM JOB
WHERE LANGUAGE_REQ IS NOT NULL
INTO :code, :grade, :cty
DO
BEGIN
i = 1;
WHILE (i <= 5) DO
BEGIN
SELECT LANGUAGE_REQ[:i] FROM JOB
WHERE ((JOB_CODE = :code) AND (JOB_GRADE = :grade)
AND (JOB_COUNTRY = :cty)) INTO :lang;
i = i + 1;
SUSPEND;
END
END
END!!
SET TERM ; !!

 
我的PROCEDURE是在SQL Expoler中创建的,不用加SET TERM,加了会出现错误。无法识别(TERM)
 
希望明天我能看到好的结果。请各位多费费神。
 
我试着建了个小库,两个字段:
CREATE TABLE STU1 (
ID INTEGER,
RIGHTS CHAR(1)
)

加了一个storeprocedure:

CREATE PROCEDURE SET_STU_RIGHT (
ID INTEGER,
RIGHTS CHAR(1)
) AS
DECLARE VARIABLE Temp INTEGER;
BEGIN
BEGIN
SELECT COUNT(*) FROM stu1 where id=:id into temp;
if ((temp=0)and (rights='t')) then
begin
INSERT INTO stu1 (id,rights)
VALUES (:id, :rights);
end
if ((temp=1)and(rights='f')) then
begin
delete from stu1 where id=:id;
end
END

END
在D4中执行正常。
你试试重新作一遍?

 
嗯, 你试试直接query运行
Execute Procedure Set_Stu_Rights(1,'T','T','F','T','T','F','T','F');
看是否执行正确.
另外
SELECT COUNT(*) FROM STURIGHTS WHERE (ID=:ID) AND (RIGHTID=:RIGHTID) INTO :Temp;
这句是否正确???
select :temp=count(*) from sturights where .... 是否支持? sql就是这么用
的.
另外count(*)用isnull(count(*),0)是否好些???
 
btw: 如果有回答, 请直接email到cytown@21cn.com一份, 因为来自大富翁的email
经常接不到:-(

interbase没用过, 不过sp很熟:-)
 
cytown:直接query运行
Execute Procedure Set_Stu_Rights(1,'T','T','F','T','T','F','T','F');
执行也不正确.
select :temp=count(*) from sturights where .... Interbase不支持。
怎么用isnull(count(*),0)呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
620
import
I
后退
顶部