重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
可以先定义个变量,发生异常的时候将异常信息赋值给变量,插入表的时候用变量,日志表没给表结构,我自己重新定义了一个,测试ok。
创新互联-成都网站建设公司,专注成都网站设计、网站制作、网站营销推广,域名与空间,雅安服务器托管,网站运营有关企业网站制作方案、改版、费用等问题,请联系创新互联。
CREATE TABLE T_LOG_ERROR
(ERR_ID NUMBER,
ERR_TIME DATE,
ERR_CODE NUMBER,
ERR_INFOR VARCHAR2(4000)
);
create or replace procedure p_testone is
v number(2);
v_sqlcode number;
v_sqlerrm varchar2(4000);
begin
select 1 / 0 into v from dual;
--异常处理
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
v_sqlcode :=sqlcode;
v_sqlerrm :=SUBSTR(sqlerrm, 1, 2000);
insert into t_log_error values(1,sysdate,v_sqlcode,v_sqlerrm);commit;
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM, 1, 200));end;
执行存储过程后就可以把异常信息记录到表t_log_error了。
因为第一个存储过程.
你查询出的数据, 存储到了 v_emp 变量中.
第二个存储过程.
你的查询结果, 没有保存的变量.
而 Oracle 存储过程, 又不像 SQL Server 那么, SELECT 语句, 就能返回结果集。
所以, 第二个存储过程要抱错了。
而且, 报错信息, 也是很明显的
SQL CREATE OR REPLACE PROCEDURE testProc
2 AS
3 BEGIN
4 SELECT 'Hello 1' AS A, 'World 1' AS B FROM DUAL UNION ALL
5 SELECT 'Hello 2' AS A, 'World 2' AS B FROM DUAL ;
6 END;
7 /
警告: 创建的过程带有编译错误。
SQL show err;
PROCEDURE TESTPROC 出现错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/3 PLS-00428: 在此 SELECT 语句中缺少 INTO 子句
就是提示你, 缺少 INTO 子句了。
是指sqlplus的查询输出格式?
这个没多大用product\12.2.0\dbhome_1\sqlplus\admin 里面有个glogin.sql能改全局设定 但没啥意义
oracle中执行了insert、update、delete这三个DML语句后,结果在未提交前实际上是保存在undo空间内,只有提交之后,才会真正写入到表中。所以会发生你的问题。
提交语句:commit
另外,在未做提交前,其他人是无法select到你处理的数据的,看到的是未处理前的数据。
还有一点要说明,当你执行了update、delete时,语句所影响的数据会被oracle自动锁定,其他人只能查,而不能update或delete,如果执行update或delete,那么就会产生数据库锁。而锁一旦产生,对系统的影响会很大,因此应尽快提交。
oracle
存储过程的基本语法
1.基本结构
CREATE
OR
REPLACE
PROCEDURE
存储过程名字
(
参数1
IN
NUMBER,
参数2
IN
NUMBER
)
IS
变量1
INTEGER
:=0;
变量2
DATE;
BEGIN
END
存储过程名字
2.SELECT
INTO
STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT
col1,col2
into
变量1,变量2
FROM
typestruct
where
xxx;
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
xxxx;
END;
...
3.IF
判断
IF
V_TEST=1
THEN
BEGIN
do
something
END;
END
IF;
4.while
循环
WHILE
V_TEST=1
LOOP
BEGIN
XXXX
END;
END
LOOP;
5.变量赋值
V_TEST
:=
123;
6.用for
in
使用cursor
...
IS
CURSOR
cur
IS
SELECT
*
FROM
xxx;
BEGIN
FOR
cur_result
in
cur
LOOP
BEGIN
V_SUM
:=cur_result.列名1+cur_result.列名2
END;
END
LOOP;
END;
7.带参数的cursor
CURSOR
C_USER(C_ID
NUMBER)
IS
SELECT
NAME
FROM
USER
WHERE
TYPEID=C_ID;
OPEN
C_USER(变量值);
LOOP
FETCH
C_USER
INTO
V_NAME;
EXIT
FETCH
C_USER%NOTFOUND;
do
something
END
LOOP;
CLOSE
C_USER;
8.用pl/sql
developer
debug
连接数据库后建立一个Test
WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试