【问题标题】:"relation does not exist" when creating a table in PostgreSQL function在 PostgreSQL 函数中创建表时“关系不存在”
【发布时间】:2018-01-24 22:52:54
【问题描述】:

在 PostgreSQL 中创建以下函数时,我得到

错误:与 OID 80424 的关系不存在 CONTEXT:SQL 函数 “test_update_icd_code”语句7 SQL状态:42P01

那么如何在函数中创建表呢?

(注意:该表将在函数完成时被删除。)

TIA

CREATE OR REPLACE FUNCTION test_update_icd_code()
    RETURNS void
AS $$   


-- Create a test table that references dx_log.
DROP TABLE IF EXISTS test;

CREATE TABLE test
(
    recid serial PRIMARY KEY,
    dx_log_recid integer NOT NULL,
    CONSTRAINT test_dx_log_fk FOREIGN KEY (dx_log_recid)
        REFERENCES dx_log (recid) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE RESTRICT
)
WITH (
    OIDS = FALSE
);

-----------

$$  LANGUAGE 'sql' VOLATILE;

【问题讨论】:

  • 我能够按原样创建函数(复制/粘贴)。当我运行它时,我得到了“表不存在”的错误。我将nova.test 更改为test,现在它可以正常工作了。您是否尝试过删除 nova 限定符?
  • @ravioli 是的...代码在函数之外运行良好。当它从函数内部运行时,就会发生错误。如何在函数内修复它? ('Nova' 仅在我收到错误后添加)
  • @ravioli 研究了提供的参考资料。我正在使用语言 SQL;我不明白为什么我需要格式;我正在创建的表是在同一个函数中创建和销毁的???
  • 请在回答部分查看我的 cmets。

标签: postgresql


【解决方案1】:

不确定为什么您的函数调用不起作用。我拿了你上面的代码,通过psql 运行它,它似乎工作正常:

postgres=# DROP TABLE IF EXISTS test;
DROP TABLE
postgres=# DROP TABLE IF EXISTS dx_log;
DROP TABLE
postgres=# CREATE TABLE dx_log (recid INTEGER PRIMARY KEY) ;
CREATE TABLE
postgres=# CREATE OR REPLACE FUNCTION test_update_icd_code()
postgres-#     RETURNS void
postgres-# AS $$
postgres$#
postgres$# -- Create a test table that references dx_log.
postgres$# DROP TABLE IF EXISTS test;
postgres$#
postgres$# CREATE TABLE test
postgres$# (
postgres$#     recid serial PRIMARY KEY,
postgres$#     dx_log_recid integer NOT NULL
postgres$#  ,CONSTRAINT test_dx_log_fk FOREIGN KEY (dx_log_recid) REFERENCES dx_log (recid) MATCH SIMPLE ON UPDATE CASCADE ON DELETE RESTRICT
postgres$# )
postgres$# WITH (
postgres$#     OIDS = FALSE
postgres$# );
postgres$#
postgres$# -----------
postgres$#
postgres$# $$  LANGUAGE 'sql' VOLATILE;
CREATE FUNCTION
postgres=# SELECT test_update_icd_code();
NOTICE:  table "test" does not exist, skipping
 test_update_icd_code
----------------------

(1 row)


postgres=# SELECT * FROM test
postgres-# ;
 recid | dx_log_recid
-------+--------------
(0 rows)

你是如何调用函数的——实际命令,什么客户端?该函数是否在到达 CREATE TABLE 之前就出错了?如果您注释掉 DROP TABLE 并运行该函数会怎样——它会做什么?

我正在使用 Postgres 10.0 进行测试

【讨论】:

  • 感谢您的帮助。显然我对错误信息的理解是错误的。你是对的。它确实按预期运行。然而,在函数的下方,调用另一个函数,这取决于可用的测试表。显然,该功能失败了。第二个调用函数看不到它。语句 7 的错误不清楚 - 这是行号还是哪个函数?...
  • 没问题 :) 不确定“语句 7”指的是什么……SQL 语句实际上只是一个以分号结尾的 SQL 命令。不过,我怀疑是这样的。也许是行号?如果您通过 psql 运行 SQL,有时它会使用克拉符号 (^) 指示错误发生的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
相关资源
最近更新 更多