• PostgreSQL Errors and Messages


    使用RAISE语句来报告消息并抛出错误

    RAISE [ level ] ’format’ [, expression [, ... ]] [ USING option = expression [, ... ] ];
    RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
    RAISE [ level ] SQLSTATE ’sqlstate’ [ USING option = expression [, ... ] ];
    RAISE [ level ] USING option = expression [, ... ];
    RAISE ;

    level选项指定错误的严重程度。允许的级别有 DEBUG, LOG, INFO, NOTICE,WARNING, 和 EXCEPTION,  默认的是EXCEPTION 。EXCEPTION 抛出一个错误 (通常终止当前错误);其他level只能生成不同优先级的消息。是否要把一个特定的优先级的消息报告给客户,写入服务器日志,是由log_min_messages和client_min_messages配置变量控制。

    任何level你都可以写一个格式(必须是一个简单的字符串文字,而不是一个简单的表达式)。格式字符串指定要报告的错误消息文本。该格式字符串可以跟可选的要被插入到消息中的参数表达式。在格式字符串中,%被替换为下一个可选参数的字符串表示形式,写两个%%发出一个%。

    在这个例子中,v_job_id的值将替换字符串中的%:

    RAISE NOTICE ’Calling cs_create_job(%)’, v_job_id;

    通过写USING后跟着option =expression可以添加额外的信息到错误报告中,每个表达式都可以是任意字符串值的表达式。允许的option关键字如下:

    MESSAGE:设置错误信息文本。此选项不能用于在USING之前包含一个格式串的RAISE格式。

    DETAIL:提供一个错误的详细信息。

    HINT:提供一个提示信息。

    ERRCODE:指定要报告的错误码(SQLSTATE),通过条件名,或者直接是一五个字符的SQLSTATE代码。

    COLUMN
    CONSTRAINT
    DATATYPE
    TABLE
    SCHEMA

    提供相关对象的名称。

    下面这个例子将中止带有给定的错误消息和提示的事务:

    RAISE EXCEPTION ’Nonexistent ID --> %’, user_id
    USING HINT = ’Please check your user ID’;

    下面两个例子显示设置SQLSTATE等效方法:

    RAISE ’Duplicate user ID: %’, user_id USING ERRCODE = ’unique_violation’;
    RAISE ’Duplicate user ID: %’, user_id USING ERRCODE = ’23505’;

    还有一个RAISE语法,主要参数是条件名或者要报告的SQLSTATE ,例如:

    RAISE division_by_zero;
    RAISE SQLSTATE ’22012’;

    在这个语法中,USING可用于提供自定义错误信息 ,细节或者提示。实现前面例子的另外一种方法是:

    RAISE unique_violation USING MESSAGE = ’Duplicate user ID: ’ || user_id;

    还有一个变体是写RAISE USING或者RAISE level USING,把所有的一切都放在USING列表中。

    RAISE的最后一个变体是没有任何参数。此表单只用于BEGIN块的EXCEPTION子句中。它会导致当前正在处理的错误被重新抛出。

    如果RAISE EXCEPTION命令中既不指定条件名也不指定SQLSTATE,默认使用RAISE_EXCEPTION (P0001)。如果不指定消息文本,默认使用条件名或者SQLSTATE作为消息文本。

     

    SELECT * INTO myrec FROM emp WHERE empname = myname;
    IF NOT FOUND THEN
    RAISE EXCEPTION ’employee % not found’, myname;
    END IF;

    BEGIN
    SELECT * INTO STRICT myrec FROM emp WHERE empname = myname;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    RAISE EXCEPTION ’employee % not found’, myname;
    WHEN TOO_MANY_ROWS THEN
    RAISE EXCEPTION ’employee % not unique’, myname;
    END;

    EXECUTE ’SELECT count(*) FROM mytable WHERE inserted_by = $1 AND inserted <= $2’
    INTO c
    USING checked_user, checked_date;

    EXECUTE ’SELECT count(*) FROM ’
    || tabname::regclass
    || ’ WHERE inserted_by = $1 AND inserted <= $2’
    INTO c
    USING checked_user, checked_date;

    EXECUTE ’UPDATE tbl SET ’
    || quote_ident(colname)
    || ’ = ’
    || quote_literal(newvalue)
    || ’ WHERE key = ’
    || quote_literal(keyvalue);

    EXECUTE ’UPDATE tbl SET ’
    || quote_ident(colname)
    || ’ = ’
    || quote_nullable(newvalue)
    || ’ WHERE key = ’
    || quote_nullable(keyvalue);

    EXECUTE ’UPDATE tbl SET ’
    || quote_ident(colname)
    || ’ = $$’
    || newvalue
    || ’$$ WHERE key = ’
    || quote_literal(keyvalue);

    EXECUTE format(’UPDATE tbl SET %I = %L WHERE key = %L’, colname, newvalue, keyvalue);

    EXECUTE format(’UPDATE tbl SET %I = $1 WHERE key = $2’, colname)
    USING newvalue, keyvalue;

  • 相关阅读:
    UVa 10010 Where's Waldorf?
    boost 学习笔记
    C++ enum类型的一个更好的用法
    新浪面试题:删除字符串中多余的空格
    微软面试题:写程序找出二叉树的深度
    c++中sizeof的分析
    复习计划
    boost学习之 时间和日期 timer
    c++ template学习总结3
    微软面试题:反序一个单向链表
  • 原文地址:https://www.cnblogs.com/songyuejie/p/5024571.html
Copyright © 2020-2023  润新知