从这个和这个我猜,ORA-00955 没有预定义的命名系统异常。
如何重写以下内容以仅捕获错误 ORA-00955?
begin
EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
Null;
end;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,是否有任何语法可以通过提供错误代码来捕获错误?
在 Postgres 中,我们使用以下代码获取异常的“堆栈跟踪”:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Run Code Online (Sandbox Code Playgroud)
这适用于“自然”异常,但如果我们使用
RAISE EXCEPTION 'This is an error!';
Run Code Online (Sandbox Code Playgroud)
...然后没有堆栈跟踪。根据邮件列表条目,这可能是故意的,尽管我终生无法弄清楚原因。这让我想找出另一种抛出异常的方法,而不是使用RAISE. 我只是错过了一些明显的东西吗?有没有人有这个技巧?我可以让 Postgres 抛出一个包含我选择的字符串的异常,这样我不仅可以在错误消息中获得我的字符串,还可以获得完整的堆栈跟踪吗?
这是一个完整的例子:
CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$
DECLARE
v_error_stack text;
BEGIN
-- Comment this out to see how a "normal" exception will give you the stack trace
RAISE EXCEPTION 'This exception will not get a stack trace';
-- This will give a divide by zero error, complete with stack …Run Code Online (Sandbox Code Playgroud) 考虑函数内的以下(不完整的)PL/pgSQL 块:
CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC)
RETURNS NUMERIC
RETURNS NULL ON NULL INPUT
IMMUTABLE
LANGUAGE plpgsql
AS $$
BEGIN
RETURN some_third_party_function(myvar1, myvar2);
EXCEPTION WHEN internal_error THEN
IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN
RETURN 0;
ELSE
-- Reraise the original exception here
RAISE EXCEPTION '%', SQLERRM;
END IF;
END
$$
Run Code Online (Sandbox Code Playgroud)
当发生意外错误时,此代码将引发具有相同消息的新异常。但是,它不会保留原始类型或上下文。
如何重新引发或重新抛出未修改的原始异常?
在 SQL Server 中,我收到以下错误“查询已被取消,因为此查询的估计成本 (5822) 超过了配置的阈值 300。请与系统管理员联系。”
这是一个非常复杂的存储过程的执行结果。对于其他存储过程,我还没有遇到过这个问题,只有这个。是否可以以某种方式更改这一过程的查询成本?我可以在执行时在存储过程本身中做到这一点吗?还是我必须只在服务器上定义它?
我正在使用 ADO.NET 命令来执行存储过程。
谢谢。
在 SQL Server 代码块中,放置提交事务的最佳位置是什么?在 try catch 块内部还是外部?
例如,选项 A 或选项 B 是正确的方法还是主观选择?
选项A
CREATE PROCEDURE DummyProc
BEGIN TRY
BEGIN TRANSACTION
INSERT sometable(a, b) VALUES (@a, @b)
INSERT sometable(a, b) VALUES (@b, @a)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION
DECLARE @msg nvarchar(2048) = error_message()
RAISERROR (@msg, 16, 1)
RETURN 55555
END CATCH
Run Code Online (Sandbox Code Playgroud)
选项B
CREATE PROCEDURE DummyProc
BEGIN TRY
BEGIN TRANSACTION
INSERT sometable(a, b) VALUES (@a, @b)
INSERT sometable(a, b) VALUES (@b, @a)
END TRY
BEGIN …Run Code Online (Sandbox Code Playgroud) 我无法ON CONFLICT处理外键为复合的外键列。这是一个例子。
create table foreign_table (
id_a text not null,
id_b text not null,
id integer primary key,
constraint ft_a_b_key unique (id_a, id_b)
);
create table my_table (
id integer,
ftable_id_a text,
ftable_id_b text,
constraint my_table_a_b_fk
foreign key (ftable_id_a, ftable_id_b) references foreign_table (id_a, id_b)
);
Run Code Online (Sandbox Code Playgroud)
使用此查询:
insert into tcell_test.my_table (id, ftable_id_a, ftable_id_b)
values (3, 'a3', 'b3') on conflict do nothing ;
Run Code Online (Sandbox Code Playgroud)
比如说,'a3'不在 中foreign_table,我希望ON CONFLICT能够处理该错误。
相反,我收到错误:
Run Code Online (Sandbox Code Playgroud)[23503] ERROR: insert or update on table …
在PostgreSQL文档状态:
任何有副作用的函数都必须标记为 VOLATILE...
考虑以下函数:
CREATE OR REPLACE FUNCTION count_items()
RETURNS integer AS
$BODY$
DECLARE
v_result INTEGER DEFAULT 0;
BEGIN
SELECT
count( t.id )
INTO
v_result
FROM
some_table t;
RETURN v_result;
EXCEPTION
WHEN OTHERS THEN
PERFORM error_log_insert( SQLSTATE, SQLERRM, current_query() );
RETURN 0;
END;
$BODY$
LANGUAGE plpgsql STABLE
COST 10;
Run Code Online (Sandbox Code Playgroud)
由于error_log_insert更改数据库(对异常执行插入),这是否意味着该count_items函数具有副作用(尽管是间接的),因此不能声明STABLE,但必须声明VOLATILE?
换句话说,函数的稳定性或波动性是否也取决于它在其异常块中调用的函数?
如果是这种情况,那么您将如何STABLE在 PostgreSQL 中创建将所有异常记录到数据库表中的函数?
我在捕获 SQLSTATE 和 SQLCODE 的过程中添加了一个 EXIT 处理程序,甚至找到了获取过程名称的方法,但我还需要知道错误发生的位置。建议非常感谢。
declare EXIT handler for SQLEXCEPTION
begin
select sysibm.routine_specific_name, SQLSTATE, SQLCODE
into v_sp_name, v_sqlstate, v_sqlcode
from sysibm.sysdummy1;
call dbms_output.put_line('Error in '||v_sp_name ' ['||v_sqlstate, v_sqlcode||']');
end;
Run Code Online (Sandbox Code Playgroud) SQL 2011 规范支持CORRESPONDING子句,
功能 F301,“
CORRESPONDING在查询表达式中”:
这是什么功能?它是如何使用的?并且,它是否得到任何行业 RDBM 的支持?
exception ×9
postgresql ×4
plpgsql ×2
sql-server ×2
code ×1
db2 ×1
db2-luw ×1
debugging ×1
foreign-key ×1
logs ×1
oracle ×1
select ×1
sql-standard ×1
t-sql ×1
transaction ×1
union ×1