oracle的plsql,checks是什么?干什么用的?

本文介绍了一次使用PLSQL将表从一个数据库导出并导入到另一个数据库时遇到的报错问题及其解决过程。错误源于源表中的检查约束(checks)名称不规范,涉及特殊字符。文中详细描述了如何通过重命名约束、直接删除约束以及导出为SQL脚本进行修改等方法解决问题。

通过plsql将库A中的表X导出pde,然后倒入到另一个库B中,报错如下:



然后去看A库中的X表,发现有个checks里有东西。

我看着像是一个约束,用来保证ID不能为空。这个设置和keys即主键不是一个道理吗?然后我去看,果然没有给这个表设置主键。。


原来设计者是想通过checks来约束id不能为空,来替代Keys这种方式。至于为什么不用key,而是用checks,我就不清楚了。感觉得不偿失,很不明智,也很没有必要,一般没有这么干的。

---

那么oracle的plsql,checks是什么?干什么用的?是不是我猜想的那样呢?

答案是:是的。

http://www.linuxidc.com/Linux/2014-11/109303.htm



亲测一下,还是按照上文的那个约束,id不能为空的约束:

首先插入一条id不为空的正常数据,正常写入一条记录到数据库。


然后插入一条id为空的数据,报错如下。



===回到该表通过plsql再次导入报错的问题,为什么?


我猜测可能是因为命名的checks的名字很诡异(其中可以看出有特殊字符和等号,如$==),不符合要求所以导入不成功。

所以我要将这个名字进行重命名。但是我发现直接通过plsql在界面上重命名,会报错,那么我只能先删除当前的,然后新增一个。


但是发现删也不能在界面上操作:


那我只能通过sql代码删除了试试了:

删除语句:


操作一把:


但是也还是不行。

我只能用终极策略了,将表X导出成sql脚本,然后:

①将sql的代码中,找到建表语句的创建checks的部分代码,然后将名称改为规范的。

②将该表删掉X。

③执行修改后的sql脚本(其中sql中也是有历史数据的,执行sql脚本一并导过来了)。

测试:



上面是建表语句,下面是历史数据。

然后导入修改后的脚本,成功。




然后再将表从库A导出成pde,然后倒入到库B,成功,没有任何报错,是done。




那我就纳闷了,这个不规范的名字,他是怎么成功写入到数据库中的?

不得而知,但是我偶然的机会发现,将之前删掉的表,之前的checks的名称就变了。。。就变成那种特殊的字符组成的东西,如果通过plsql的界面进行恢复,那checks的名称就当然变成那种特殊的字符组成的东西,我猜很有可能就是这个原因导致的。



然后如果恢复回去





### ### PL/SQL 中全局变量的定义及使用方法 在 PL/SQL 中,全局变量通常指在包中定义的变量,这些变量的作用域和生命周期覆盖整个会话,可以在包内的多个子程序中访问和修改。包中的全局变量分为**公共变量**(在包规范中声明)和**私有变量**(在包体中声明)[^3]。 #### 公共全局变量 公共全局变量在包规范中声明,对外部可见,允许其他程序访问和修改。例如: ```plsql CREATE OR REPLACE PACKAGE employee_pkg IS g_company_name VARCHAR2(100) := 'ABC Corporation'; -- 公共全局变量 PROCEDURE update_company_name(new_name VARCHAR2); END employee_pkg; ``` ```plsql CREATE OR REPLACE PACKAGE BODY employee_pkg IS PROCEDURE update_company_name(new_name VARCHAR2) IS BEGIN g_company_name := new_name; -- 修改公共全局变量 END update_company_name; END employee_pkg; ``` 在外部调用中,可以直接访问 `g_company_name` 的值: ```plsql BEGIN DBMS_OUTPUT.PUT_LINE(employee_pkg.g_company_name); -- 输出当前值 END; ``` 公共全局变量在会话期间保持其值,直到会话结束或显式修改其值[^1]。 #### 私有全局变量 私有全局变量在包体中声明,仅在包体内可见,外部无法直接访问。例如: ```plsql CREATE OR REPLACE PACKAGE BODY employee_pkg IS g_counter NUMBER := 0; -- 私有全局变量 PROCEDURE increment_counter IS BEGIN g_counter := g_counter + 1; -- 修改私有全局变量 END increment_counter; FUNCTION get_counter RETURN NUMBER IS BEGIN RETURN g_counter; -- 返回私有全局变量的值 END get_counter; END employee_pkg; ``` 外部程序无法直接访问 `g_counter`,但可以通过包中定义的函数获取其值: ```plsql BEGIN employee_pkg.increment_counter; DBMS_OUTPUT.PUT_LINE(employee_pkg.get_counter); -- 输出 1 END; ``` 私有全局变量提供了更好的封装性,避免外部程序直接修改变量值,从而提高代码的安全性和可维护性[^3]。 #### 全局变量的赋值与输出 在 PL/SQL 中,变量可以在声明时赋
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值