

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# SVL\_STORED\_PROC\_MESSAGES
<a name="r_SVL_STORED_PROC_MESSAGES"></a>

您可以查询 SVL\_STORED\_PROC\_MESSAGES 系统视图以获取有关存储过程消息的信息。即使存储过程调用已取消，也会记录引发的消息。每个存储过程调用接受一个查询 ID。有关如何设置记录的消息的最低级别的更多信息，请参阅 stored\_proc\_log\_min\_messages。

SVL\_STORED\_PROC\_MESSAGES 对所有用户可见。超级用户可以查看所有行；普通用户只能查看其自己的数据。有关更多信息，请参阅 [系统表和视图中的数据可见性](cm_chap_system-tables.md#c_visibility-of-data)。

此表中的部分或全部数据也可以在 SYS 监控视图 [SYS\_PROCEDURE\_MESSAGES](SYS_PROCEDURE_MESSAGES.md) 中找到。SYS 监控视图中的数据经过格式化处理，便于使用和理解。我们建议您使用 SYS 监控视图进行查询。

## 表列
<a name="r_SVL_STORED_PROC_MESSAGES-table-columns"></a>


| 列名称  | 数据类型  | 描述  | 
| --- | --- | --- | 
| userid  | integer  | 使用其权限来运行语句的用户的 ID。如果此调用嵌套在 SECURITY DEFINER 存储过程中，则这是该存储过程的拥有者的 userid， | 
| session\_userid  | integer  | 创建会话的用户的 ID，是顶级存储过程调用的调用方。 | 
| pid | integer  | 进程 ID。 | 
| xid | bigint | 过程调用查询的事务 ID。 | 
| query  | integer  | 过程调用的查询 ID。 | 
| recordtime | timestamp | 引发消息的时间 (UTC)。 | 
| loglevel | integer | 引发的消息的日志级别数值。可能的值：20（对于 LOG）、30（对于 INFO）、40（对于 NOTICE）、50（对于 WARNING）、60（对于 EXCEPTION） | 
| loglevel\_text | character(10)  | 与 loglevel 中的数值对应的日志级别。可能的值：LOG、INFO、NOTICE、WARNING 和 EXCEPTION。 | 
| message | character(1024) | 引发的消息的文本。 | 
| linenum | integer  | 引发的语句的行号。 | 
| querytext | character(500)  | 过程调用查询的实际文本。 | 
| label | character(320)  | 用于运行查询的文件的名称或使用 SET QUERY\_GROUP 命令定义的标签。如果查询并非基于文件或未设置 QUERY\_GROUP 参数，则此字段值为默认值。 | 
| aborted  | integer  | 如果存储过程已由系统停止或已由用户取消，则此列包含 1。如果调用运行完成，则此列包含 0。 | 
| message\_xid | bigint | 引发的消息的事务 ID。 | 

## 示例查询
<a name="r_SVL_STORED_PROC_MESSAGES-sample-query"></a>

以下 SQL 语句说明了如何使用 SVL\_STORED\_PROC\_MESSAGES 查看引发的消息。

```
-- Create and run a stored procedure
CREATE OR REPLACE PROCEDURE test_proc1(f1 int) AS
$$
BEGIN
    RAISE INFO 'Log Level: Input f1 is %',f1;
    RAISE NOTICE 'Notice Level: Input f1 is %',f1;
    EXECUTE 'select invalid';
    RAISE NOTICE 'Should not print this';

EXCEPTION WHEN OTHERS THEN
     raise exception 'EXCEPTION level: Exception Handling';
END;
$$ LANGUAGE plpgsql;

-- Call this stored procedure
CALL test_proc1(2);

-- Show raised messages with level higher than INFO
SELECT query, recordtime, loglevel, loglevel_text, trim(message) as message, aborted FROM svl_stored_proc_messages 
  WHERE loglevel > 30 AND query = 193 ORDER BY recordtime;

 query |         recordtime         | loglevel | loglevel_text |               message               | aborted
-------+----------------------------+----------+---------------+-------------------------------------+---------
   193 | 2020-03-17 23:57:18.277196 |       40 | NOTICE        | Notice Level: Input f1 is 2         |       1
   193 | 2020-03-17 23:57:18.277987 |       60 | EXCEPTION     | EXCEPTION level: Exception Handling |       1
(2 rows)

-- Show raised messages at EXCEPTION level
SELECT query, recordtime, loglevel, loglevel_text, trim(message) as message, aborted FROM svl_stored_proc_messages 
  WHERE loglevel_text = 'EXCEPTION' AND query = 193 ORDER BY recordtime;
        
 query |         recordtime         | loglevel | loglevel_text |               message               | aborted
-------+----------------------------+----------+---------------+-------------------------------------+---------
   193 | 2020-03-17 23:57:18.277987 |       60 | EXCEPTION     | EXCEPTION level: Exception Handling |       1
```

以下 SQL 语句说明了在创建存储过程时如何使用 SVL\_STORED\_PROC\_MESSAGES 和 SET 选项查看引发的消息。由于 test\_proc() 的最低日志级别为 NOTICE，因此，仅在 SVL\_STORED\_PROC\_MESSAGES 中记录 NOTICE、WARNING 和 EXCEPTION 级别消息。

```
-- Create a stored procedure with minimum log level of NOTICE 
CREATE OR REPLACE PROCEDURE test_proc() AS
$$
BEGIN
    RAISE LOG 'Raise LOG messages';
    RAISE INFO 'Raise INFO messages';
    RAISE NOTICE 'Raise NOTICE messages';
    RAISE WARNING 'Raise WARNING messages';
    RAISE EXCEPTION 'Raise EXCEPTION messages';
    RAISE WARNING 'Raise WARNING messages again'; -- not reachable
END;
$$ LANGUAGE plpgsql SET stored_proc_log_min_messages = NOTICE; 

-- Call this stored procedure
CALL test_proc();

-- Show the raised messages
SELECT query, recordtime, loglevel_text, trim(message) as message, aborted FROM svl_stored_proc_messages 
  WHERE query = 149 ORDER BY recordtime;
  
 query |         recordtime         | loglevel_text |          message         | aborted
-------+----------------------------+---------------+--------------------------+---------
   149 | 2020-03-16 21:51:54.847627 | NOTICE        | Raise NOTICE messages    |       1
   149 | 2020-03-16 21:51:54.84766  | WARNING       | Raise WARNING messages   |       1
   149 | 2020-03-16 21:51:54.847668 | EXCEPTION     | Raise EXCEPTION messages |       1
(3 rows)
```