标签: exception

如何仅捕获和处理特定的 Oracle 异常?

这个这个我猜,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)

顺便说一句,是否有任何语法可以通过提供错误代码来捕获错误?

oracle exception

22
推荐指数
2
解决办法
7万
查看次数

如何在 PL/pgSQL 中获取手动引发的异常的异常上下文?

在 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)

postgresql error-handling exception plpgsql postgresql-9.3

11
推荐指数
2
解决办法
2万
查看次数

如何在 PL/pgSQL EXCEPTION 块中重新引发异常?

考虑函数内的以下(不完整的)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)

当发生意外错误时,此代码将引发具有相同消息的新异常。但是,它不会保留原始类型或上下文。

如何重新引发或重新抛出未修改的原始异常?

postgresql exception plpgsql

6
推荐指数
1
解决办法
3828
查看次数

一个复杂的存储过程导致估计成本异常

在 SQL Server 中,我收到以下错误“查询已被取消,因为此查询的估计成本 (5822) 超过了配置的阈值 300。请与系统管理员联系。”

这是一个非常复杂的存储过程的执行结果。对于其他存储过程,我还没有遇到过这个问题,只有这个。是否可以以某种方式更改这一过程的查询成本?我可以在执行时在存储过程本身中做到这一点吗?还是我必须只在服务器上定义它?

我正在使用 ADO.NET 命令来执行存储过程。

谢谢。

sql-server sql-server-2008-r2 exception

5
推荐指数
2
解决办法
1569
查看次数

在使用 TRY CATCH 的 SQL Server 中提交事务的最佳实践

在 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)

sql-server t-sql transaction exception code

5
推荐指数
2
解决办法
2万
查看次数

如何使 ON CONFLICT 适用于复合外键列?

我无法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能够处理该错误。

相反,我收到错误:

[23503] ERROR: insert or update on table …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key exception

5
推荐指数
1
解决办法
9357
查看次数

稳定(或不可变)函数可以调用 volatile 函数吗?

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 中创建将所有异常记录到数据库表中的函数?

postgresql logs exception

4
推荐指数
2
解决办法
1302
查看次数

显示 DB2 存储过程中发生错误的行号

我在捕获 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)

db2 stored-procedures debugging exception db2-luw

3
推荐指数
1
解决办法
178
查看次数

什么是 F301:查询表达式中的 CORRESPONDING 子句?

SQL 2011 规范支持CORRESPONDING子句,

功能 F301,“CORRESPONDING在查询表达式中”:

这是什么功能?它是如何使用的?并且,它是否得到任何行业 RDBM 的支持?

select exception union sql-standard

0
推荐指数
1
解决办法
609
查看次数