使用 SQL Developer 开发和调试 PL/SQL
目的
本教程向您介绍如何使用 SQL Developer 创建、运行以及调试 PL/SQL 过程。
所需时间
大约 30 分钟
主题
![]() | 概述 | |
![]() | 前提条件 | |
![]() | 创建数据库连接 | |
![]() | 浏览数据库 | |
![]() | ||
![]() | 运行 PL/SQL 过程 | |
![]() | 调试 PL/SQL 过程 | |
![]() | 总结 |
查看屏幕截图
将鼠标置于此图标上以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)
注意:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。
概述
体系结构
前提条件
1. | 能够访问 Oracle 数据库 10g 实例或者完成了教程 在 Windows 上安装 Oracle 数据库 10g。 注意:您还可以连接到非 Windows 数据库来完成本教程。 | |
2. | 从 OTN 下载 Oracle SQL Developer 并将其解压缩到计算机上的任何目录。 | |
3. | 如果尚未进行此操作,DBA 用户需要解锁模式以提供访问。使用以下命令可以完成此操作: ALTER USER hr UNLOCK ACCOUNT; ALTER USER hr IDENTIFIED BY hr;
| |
4. | 对于本教程的 PL/SQL 调试部分,HR 用户需要一些额外的权限。使用以下命令授予权限: GRANT debug any procedure, debug connect session TO hr; |
创建数据库连接
1. | 打开 Windows 资源管理器,双击 \sqldeveloper\sqldeveloper.exe 。 注意:您也可以在非 Windows 环境中执行 sqldeveloper。 | |
2. | 在 Connections 选项卡中,右键单击 Connections 并选择 New Database Connection。
| |
3. | 在 Connection Name 域中输入 HR_ (或者标识您的连接的任何其他名称),在 Username 和 Password 域中输入 hr ,指定您的 作为 Hostname,在 SID 域中输入 。然后单击 Test。
| |
4. | 连接状态已成功测试。但没有保存该连接。要保存该连接,请单击 Connect。
| |
5. | 保存了该连接,您可以在列表中看到该数据库。展开 。
| |
6. | 打开连接时,自动打开 SQL Worksheet。SQL Worksheet 允许您针对您刚创建的连接执行 SQL。
|
浏览数据库
1. | 展开 Tables 节点。
| |
2. | 单击 EMPLOYEES 表,查看表定义。
| |
3. | 要查看该数据,请单击 Data 选项卡。
| |
4. | 单击导航器中的 DEPARTMENTS 表。
| |
5. | DEPARTMENTS 表有许多约束。当表定义显示时,选择 Constraints 选项卡。
| |
6. | 单击 Edit 图标。
| |
7. | 该对话框有多个选项卡,选择 Foreign Keys 选项卡。
查看外键。然后单击 OK。
| |
8. | 通过在导航器中依次选中 JOBS 和 LOCATIONS 表并查看定义和数据,验证这两个表存在且具有数据。 |
创建并编译 PL/SQL 过程
在本主题中,您创建、编辑并编译一个 PL/SQL 过程。执行以下步骤:
1. | 在 Connections 导航器中,右键单击 Procedures 节点以调用上下文菜单,然后选择 Create PROCEDURE。
| |
2. | 输入 EMP_LIST 作为过程名。然后单击 +,添加一个参数。
| |
3. | 双击参数,您可以将值更改为 pMaxRows,然后将 VARCHAR2 更改为 NUMBER。确保在单击 OK 之前按了 Enter 键。
| |
4. | 随即显示指定了参数的过程的框架。
| |
5. | 替换以下 PL/SQL: BEGIN NULL; END; 使用以下代码: CURSOR emp_cursor IS SELECT l.state_province, l.country_id, d.department_name, e.last_name, j.job_title, e.salary, e.commission_pct FROM locations l, departments d, employees e, jobs j WHERE l.location_id = d.location_id AND d.department_id = e.department_id AND e.job_id = j.job_id; emp_record emp_cursor%ROWTYPE; TYPE emp_tab_type IS TABLE OF emp_cursor%ROWTYPE INDEX BY BINARY_INTEGER; emp_tab emp_tab_type; i NUMBER := 1; BEGIN OPEN emp_cursor; FETCH emp_cursor INTO emp_record; emp_tab(i) := emp_record; WHILE ((emp_cursor%FOUND) AND (i <= pMaxRows) LOOP i := i + 1; FETCH emp_cursor INTO emp_record; emp_tab(i) := emp_record; END LOOP; CLOSE emp_cursor; FOR j IN REVERSE 1..i LOOP DBMS_OUTPUT.PUT_LINE(emp_tab(j).last_name); END LOOP; END; 注意 SQL Developer 是如何自动设置代码的格式的。单击工具栏中的 Save
| |
6. | 在导航器中展开 Procedures。
| |
7. | 注意,当 SQL Developer 检测到无效 PL/SQL 子程序时,系统导航器中该子程序的图标上用红色的 X 来指示状态。
Log 窗口中显示编译错误。只需双击错误,即可导航到错误中报告的对应行。SQL Developer 还在右侧边列 (gutter) 中显示错误和提示。如果您将鼠标放在边列中每个红色方块上,将显示错误消息。 在本例中,错误消息指示 LOOP 语句中存在格式错误。仔细检查代码后,您会发现 WHILE 语句中多了一个圆括号。删除多余的圆括号。
| |
8. | 单击 Compile 图标。
| |
9. | 该过程成功编译。您现在可以运行该过程。
|
运行 PL/SQL 过程
创建并编译了一个 PL/SQL 过程之后,您可以使用 SQL Developer 运行它。执行以下步骤:
1. | 在左侧导航器中,右键单击 EMP_LIST 并选择 Run。
| |
2. | 该操作将调用 Run PL/SQL 对话框。Run PL/SQL 对话框允许您选择要运行的目标过程或函数(对程序包有用),并显示所选目标的参数列表。PL/SQL 块文本区域中包含的是 SQL Developer 用来调用所选程序的生成代码。您可以使用该区域填充要传送到程序单元的参数以及处理复杂的返回类型。
将 PMAXROWS := NULL; 更改为 PMAXROWS := 5; 然后,单击 OK。
| |
3 . | Log 窗口中显示了返回的 5 行结果。
|
调试 PL/SQL 过程
SQL Developer 还支持使用 Oracle 数据库进行 PL/SQL 调试。在本主题中,您调试一个 PL/SQL 过程、单步调试代码并在运行时修改值。执行以下步骤:
1. | 通过在 OPEN emp_cursor; 语句所在行对应的代码左侧区中单击,可在 EMP_LIST 过程中设置一个断点。
| |
2. | 单击 Debug 图标(瓢虫)。
| |
3. | Debug PL/SQL 对话框应仍显示值 PMAXROWS = 5; 单击 OK。
| |
4. | 调试器应在您设置断点处暂停。您现在可以控制执行流程、修改变量值以及执行其他调试函数。
注意:如果您此时收到错误消息“This session requires DEBUG CONNECT SESSION and DEBUG ANY PROCEDURE user privileges”,您需要完成 前提条件中的步骤 4。
| |
5. | 单击 Step Into
| |
6. | 这将转至光标所在的第一行。再次单击 Step Into
| |
7. | 您现在应该选择光标所在的第一行。第 3 次单击 Step Into
| |
8. | Smart Data 窗口开始显示有限的变量列表,这些变量用在要执行的代码行中以及之前执行的代码中。
| |
9. | 右键单击 DBMS_OUTPUT.PUT_LINE(emp_tab(j).last_name); 这行,然后选择 Run to Cursor。
| |
10. | 展开 emp_tab > values > [1] > _key。您会看到表中给定记录中域的值。选择 LAST_NAME 域。
| |
11. | 右键单击 LAST_NAME 域并选择 Modify Value。
| |
12. | 将名称更改为别的内容,单击 OK。
| |
13. | 单击 Resume 图标
| |
14. | 查看修改后的值是否显示在 Log 窗口中。
|