【问题标题】:Issue While creating function in PostgreSQL "ERROR: syntax error at or near "ROWTYPE""在 PostgreSQL 中创建函数时出现问题“错误:“ROWTYPE”或附近的语法错误”
【发布时间】:2017-12-21 20:21:35
【问题描述】:

下面是一个简单的PL/SQL过程

PROCEDURE emp_get_rec (emp_rec IN OUT NOCOPY emp_content%ROWTYPE)
  IS
    v_cnt   NUMBER;
  BEGIN
    SELECT COUNT(*)
    INTO v_cnt
    FROM emp_content
    WHERE emp_id = emp_rec.emp_id;
    IF v_cnt = 1
    THEN
      SELECT * INTO emp_rec
      FROM emp_content
      WHERE emp_id = emp_rec.emp_id;
    END IF;
 END emp_get_rec;

我试图在 PostgreSQL 中转换,

Create or replace function emp_get_rec (emp_rec IN OUT emp_content%ROWTYPE)
AS $BODY$
DECLARE
    v_cnt   NUMBER;
BEGIN

       SELECT COUNT(*)
    INTO v_cnt
    FROM emp_content
    WHERE emp_id = emp_rec.emp_id;
    IF v_cnt = 1
    THEN
      SELECT * INTO emp_rec
      FROM emp_content
      WHERE emp_id = emp_rec.emp_id;
    END IF;
 END;
$BODY$ LANGUAGE 'plpgsql';

我面临以下错误:

错误:“ROWTYPE”处或附近的语法错误

【问题讨论】:

  • 如果你在“ROWTYPE”处或附近有错误,那么只需删除%ROWTYPE(包括百分号):o)在PostgreSQL表/视图名称可以用作类型名称,没有任何补充。
  • Abeslisto,参数为in和out类型。我需要通过传递其完整记录的其他函数调用此特定函数。因此必须使用 inode 来提供完整的行集 %ROWTYPE。因此,如果您可以共享一些相同的语法。
  • Abelisto 想说的是:%ROWTYPE 在 Postgres 中不需要。您可以将表名用作“数据类型”并将完整记录传递给该函数。

标签: sql postgresql plpgsql


【解决方案1】:

Documentation says:

每当创建表时,也会自动创建一个复合类型,与表同名,来表示表的行类型。

所以你可以使用表名作为类型名,在语法上它意味着一个类型:

create or replace function emp_get_rec (emp_rec IN OUT emp_content)

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多