在 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 中操作表的主要内容,如果未能解决你的问题,请参考以下文章