存储过程修改记录
㈠ oracle 查询存储过程什么时候修改过
USER_OBJECTS这个数据字典里面有记录的
SELECT OBJECT_NAME,CREATED,LAST_DDL_TIME FROM USER_OBJECTS WHERE OBJECT_TYPE ='PROCEDURE';
㈡ 啥叫“存储过程”啊
存储过程
存储过程是保存在数据库中的专门进行数据操作的代码过程。存储过程通常与触发器结合使用,来控制数据的完整性。在打开数据库时,存储过程被自动加载到内存中,可以象其他过程文件一样进行调用。
1.建立存储过程
可以在项目管理器中选择建立或修改存储过程。在项目管理器的Data选项卡中选定Stored Proceres节点,然后单击New、Add或Modify按钮都将打开存储过程文本编辑器,如图7-12所示。
也可以在首先打开数据库的情况下,执行MODIFY STRUCTURE命令打开存储过程文本编辑器。如:
OPEN DATABASE dbMyData
MODIFY STRUCTURE
一个数据库的所有存储过程包含在一个文件中,过程使用PROCEDURE语句声明,这与一般的过程文件是完全一样的。
例如,下面为数据库建立了一个名为NewStuId的存储过程,该过程为学生档案表的StuId字段根据当前StuId中的最大值自动生成一个编号,并保存到StuId字段中中,如图7-13所示。
图7-12 可以在项目管理器选择建立或修改存储过程
图7-13 NewStuId存储过程
执行下面的代码,将在学生档案表中添加一条新记录,并为StuId字段赋值。
APPEND BLANK
NewStuId() &&执行存储过程
需要注意的是,如果准备存储过程用于表的触发器,则不能包含如图7-13中所示的CALCULATE、GO和REPLACE这些引起记录移动的命令。
2.从文本文件中导入存储过程
可以使用APPEND PROCEDURES命令将文本文件中的存储过程以编程的方式添加到当前数据库中,其语法格式如下:
APPEND PROCEDURES FROM FileName [AS nCodePage] [OVERWRITE]
其中,FileName指定保存存储过程的文本文件名称;AS nCodePage指定要追加其存储过程的文本文件要转换的代码页;OVERWRITE指定用文本文件中的过程改写数据库中的当前存储过程,如果不包含此参数,文本文件中的存储过程将追加到当前存储过程中。
需要注意的是,在使用该命令前,数据库必须以独占方式打开并设置为当前数据库。
3.将存储过程导出到文本文件中
可以使用COPY PROCEDURES命令将当前数据库中的存储过程导出到文本文件,其语法格式如下:
COPY PROCEDURES TO FileName [AS nCodePage] [ADDITIVE]
其中,FileName指定文本文件名,存储过程将被复制到此文本文件中;AS nCodePage指定文本文件的代码页;ADDITIVE指定将存储过程追加到指定文本文件尾,如果若省略该参数,则覆盖文本文件的内容。
4.查看数据库中的存储过程
可以使用DISPLAY PROCEDURES或LIST PROCEDURES命令显示当前数据库中的存储过程名称,二者的功能基本相同。其中,DISPLAY PROCEDURES命令的语法格式如下:
DISPLAY PROCEDURES [TO PRINTER [PROMPT] | TO FILE FileName] [NOCONSOLE]
其中,TO PRINTER [PROMPT]指定将显示结果输出到打印机中,包含PROMPT子句可以在打印开始前显示一个打印对话框;TO FILE FileName指定将显示结果输出到FileName指定的文件中;NOCONSOLE指定不向Visual FoxPro主窗口或活动的用户自定义窗口输出。
例如,下面的代码将显示dbMyData数据库中的存储过程名称。
OPEN DATABASE dbMyData
DISPLAY PROCEDURES
7.3.6 设置触发器
触发器是绑定在表上的表达式,当表中的任何记录被指定的操作命令修改时,触发器被激发。当数据修改时,触发器可执行数据库应用程序要求的任何其他操作。
触发器作为特定表的属性来创建和存储。如果从数据库中移去一个表,则同时删除和该表相关联的触发器。从前面的表7-7可以看出,触发器是在进行了其他所有检查之后(如有效性规则、主关键字的实施,以及NULL值的实施)被激活,位于所有约束的最后面。并且与字段级规则和记录级规则不同,触发器不对缓冲数据起作用。
1.建立触发器
可以使用表设计器或CREATE TRIGGER命令来创建触发器。对于每个表,可为插入、更新及删除3个事件各创建一个触发器。在任何情况下,一个表最多只能有3个触发器。触发器必须返回“真”(.T.)或“假”(.F.),只有返回“真”时操作才能继续进行。能够激发触发器的命令如表7-9所示。
表7-9 能够激发触发器的命令
触发器
命令
删除触发器
DELETE命令
插入触发器
APPEND FROM、APPEND FROM ARRAY、APPEND BLANK、IMPORT、INSERT-sql和RECALL命令
序表
触发器
命令
更新触发器
GATHER、REPLACE、REPLACE FROM ARRAY和UPDATE SQL命令
需要注意的是,不能对有触发器的表使用INSERT命令,但是可以使用INSERT-SQL命令;发出PACK或ZAP不会激发任何触发器;如果更新具有删除标记的记录,不会激发触发器;如果表使用了缓冲模式,只有当使用TABLEUPDATE( )函数进行发送更新时,才激发更新触发器。
下面是在dbMyData数据库中建立的4个存储过程。其中,InsertData用于在添加记录时显示一个“新增记录…”提示;UpdateData用于在记录更新时自动将更新记录写入到一个日志表tblStudent2中,来记录用户对学生档案表所做的修改;DeleteData用于在删除记录时显示一个信息框,询问用户是否确认删除记录;WriteLog用于写入日志,该过程可以接收来自UpdateData过程的参数传入值。
PROCEDURE WriteLog
PARAMETERS lcStuId,lcStuName,lcClassName,ldEnterDate,lnChinese,lnMaths,lnTotal
*!* 将变动写入到日志表tblStuden2中
INSERT INTO tblStudent2 (StuId,StuName,ClassName,EnterDate,Chinese,Maths,Total) ;
VALUES (lcStuId,lcStuName,lcClassName,ldEnterDate,lnChinese,lnMaths,lnTotal)
PROCEDURE InsertData
WAIT WINDOW "新增记录..." NOWAIT TIMEOUT 2
RETURN .T.
PROCEDURE UpdateData
WAIT WINDOW "正在将变动写入日志表..." NOWAIT TIMEOUT 2
WriteLog(StuId,StuName,ClassName,EnterDate,Chinese,Maths,Total)
RETURN .T.
PROCEDURE DeleteData
IF MESSAGEBOX("确认删除该记录吗?",4+32," 提示")=6
RETURN .T.
ELSE
RETURN .F.
ENDIF
打开表设计器,在Table选项卡的Insert trigger、Update trigger和Delete trigger文本框中分别输入InsertData()、UpdateData()和DeleteData(),如图7-14所示。
图7-14 为表建立触发器
也可以使用CREATE TRIGGER命令为表建立触发器表达式,该命令的语法格式如下:
CREATE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE AS lExpression
其中,TableName是要建立触发器的表名称,lExpression是触发器表达式。例如,下面使用该命令为学生档案表建立了与图7-14同样的触发器表达式。
OPEN DATABASE dbMyData
CREATE TRIGGER ON 学生档案表 FOR INSERT AS InsertData() &&建立插入触发器
CREATE TRIGGER ON 学生档案表 FOR UPDATE AS UpdateData() &&建立更新触发器
CREATE TRIGGER ON 学生档案表 FOR DELETE AS DeleteData() &&建立删除触发器
2.删除触发器
可以在表设计器的Table选项卡中删除触发器或使用DELETE TRIGGER命令从数据库表中删除触发器。其中,DELETE TRIGGER命令的语法格式如下:
DELETE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE
其中,TableName是要删除触发器的表名称。
例如,下面的代码将删除学生档案表中的插入触发器。
DELETE TRIGGER ON 学生档案表 FOR INSERT
3.修改触发器
可以在表设计器的Table选项卡中或者使用CREATE TRIGGER命令来修改触发器。使用命令修改触发器与建立触发器时相同。
㈢ mysql存储过程的if判断有多个条件该怎么优化效率
这个应该不会太慢吧,我建议你看一下,你是不是循环做了太多次的插入/更新操作。
mysql默认的配置中,每次事务提交都要写binlog和redo log,如果循环太多次——比如循环插入10w条记录——就会非常慢。一般优化思路分两种:
1 修改 sync_binlog为一个100-1000间的值,让binlog每隔100-1000个事务后再写一次;修改innodb_flush_log_at_trx_commit =2; 这么搞的好处是降低了写log的次数和消耗的时间,缺点是,中间出错的话,会丢失一部分的binlog和redolog导致无法通过他们来在出问题是恢复生产库数据。
2 将所有的插入/更新操作放到一个事务中进行。这样,显然就只需要一次写binlong和redolog咯。
㈣ MySQL在原存储过程中增加update修改记录行报1064错误请教大神
1064是SQL的语法错误,最简单最低级的错误而已。
你这个update语句本身就有问题:
UPDATE woic SET seq=comments WHERE seq='000' AND check_passed=0;
这里的comments 应该是传进来的吧?你如果不传进来就要给常量。
㈤ php5.3执行sql server2005的存储过程,该怎么获取存储过程的查询记录
方法:
1、打开SQLServerManagementStudio并连接到数据库引擎数据库。
㈥ 在sql存储过程中@@rowcount<>0是什么意思
在SQL存储过程中,`@@rowcount > 0` 表示上一条执行的SQL语句影响了数据,即有行被修改、删除或插入。这个变量作为计数器,记录了上一操作的结果。当`@@rowcount`的值不为零,通常意味着操作执行成功,比如更新或插入操作。
首先,`@@ROWCOUNT`是一个内置的SQL Server系统函数,它返回的是上一条SQL语句对数据库产生的影响行数。这个值对于跟踪和验证操作的执行效果非常有用。如果一个语句没有改变任何行,比如在`IF`语句中,`@@ROWCOUNT`会被设置为0。
其次,`@@ROWCOUNT`的返回类型是整数,这对于编程时判断操作是否成功至关重要。例如,在一个存储过程中,如果执行`UPDATE`语句后,通过检查`@@ROWCOUNT`是否等于0,你可以确定是否所有更新都成功。
在实际应用中,一个常见的用法是在`UPDATE`或`INSERT`语句后检查`@@ROWCOUNT`。如果`UPDATE`语句改变了至少一行数据,`@@ROWCOUNT`将大于0,表示操作成功。相反,如果`UPDATE`语句没有影响任何行,`@@ROWCOUNT`为0,这通常会被视为插入或更新失败的信号。
总的来说,`@@rowcount > 0`在存储过程中是一个重要的条件判断,它可以帮助开发者确定操作是否按预期执行,从而确保数据的一致性和完整性。