在 Oracle 中操作表

Posted

技术标签:

【中文标题】在 Oracle 中操作表【英文标题】:Manipulating tables in Oracle 【发布时间】:2013-05-13 12:54:36 【问题描述】:

创建和使用不与存储在数据库中的数据交互的 pl/sql 过程很容易制作和执行,但显然用途有限。

但是我在处理这些存储的数据时遇到了一些困难。

以函数为例:

CREATE OR REPLACE PROCEDURE update_emp (emp_rec CONTACT%ROWTYPE) IS

  fistname VARCHAR (40);
  BEGIN
  firstname := TRIM(fname);
        UPDATE contact
        SET    FNAME = firstname
        WHERE CONTACT_ID = emp_rec.id;
   END update_emp;
   /

设计用于包含列 FNAME 和主键 CONTACT_ID 的 CONTACT 表;上面的代码抛出编译错误:

必须声明标识符“FNAME”

如何让函数知道这个专栏?

【问题讨论】:

您正确使用参数名称来引用更新语句中的 ID 列。为什么不尝试对变量赋值做同样的事情呢? 这个fistname VARCHAR (40);firstname :=TRIM(fname); 你错过了r 减速呢 "...明显的使用受限。"为什么?我想说的恰恰相反。 【参考方案1】:

在这一行:

fistname := TRIM(fname);

您正在引用一个变量 fname,并且没有声明。

我的猜测是您实际上想要使用传递给过程的记录中的fname 列:

fistname := TRIM(emp_rec.fname);

【讨论】:

只是想知道:在这种情况下,行是通过引用传递的对象吗? @Duncan:你可以这样想象,是的。尽管 Oracle 中的“真实”对象类型和“记录类型”之间存在细微差别。【参考方案2】:

快速浏览一下您的代码,错误似乎与该行有关

fistname := TRIM(fname);

程序不知道 fname 是什么。

【讨论】:

【参考方案3】:

您声明 fistname VARCHAR (40); 并更新您使用的声明 SET FNAME = firstname

应该是

SET FNAME = fistname

【讨论】:

【参考方案4】:

真的不需要firstname 变量:

CREATE OR REPLACE PROCEDURE update_emp (emp_rec IN OUT CONTACT%ROWTYPE) IS
BEGIN
  UPDATE contact
    SET FNAME = TRIM(emp_rec.FNAME)
    WHERE CONTACT_ID = emp_rec.ID;
END update_emp;

分享和享受。

【讨论】:

以上是关于在 Oracle 中操作表的主要内容,如果未能解决你的问题,请参考以下文章

oracle中有关表的操作

ORACLE 添加删除表字段操作

oracle对表的基本操作

oracle菜鸟学习之 表操作

Oracle 11g 学习3——表空间操作

ORACLE-020:ORACLE技巧002 批量操作表