使用 SQLPlus 时,有什么方法可以获取 SQL 语句的语法?

Is there any way to get the syntax of an SQL statement when using SQLPlus?

我有一个使用 SQLPlus 的考试,有时我不记得 SQL 语句的确切语法,所以我想知道是否有任何方法可以从里面 SQLPlus.

例如,假设我忘记了如何使用 INSERT INTO,我需要这样的提醒:

INSERT INTO table-name (column-names) 
VALUES (values)

这可能吗?

我尝试了 HELP 命令,但 none 似乎符合我的需要。 我用谷歌搜索没有成功。

没有。 SQL 是一种标准化语言(至少是 ANSI SQL)并且 SQLPlus "just" 使用该语法,因此内部帮助不涵盖它。内部帮助仅列出 SQL加上特定命令(例如 SET、CONNECT、SPOOL)。

可以通过某种方式解决该问题,但非常有限。您可以为某些现有对象调用 dbms_metadata.get_ddl 函数。其中一些 DDL 可能包含您感兴趣的语句。例如 - 您希望看到 select 语句 - 然后您可以为某些现有视图调用 dbms_metadata.get_ddl

select dbms_metadata.get_ddl('VIEW', 'USER_TABLES', 'SYS') 
  from dual;

请注意 - 它仅适用于 Oracle 11G 及更低版本,在最新的 SYS 中无法以这种方式访问​​对象(我不确定 Oracle 12.1)。

比较有趣的是tiggers、procedure、functions和packages。您不能使用 dbms_metadata 获取 SYS 拥有的包的 DDL,但也许您可以连接到一些示例模式,如 HR(人力资源)、AD(学术)、SH(销售历史)。

在 HR schema 中有一个存储过程 ADD_JOB_HISTORY,里面有 insert statement,所以它看起来像这样:

select dbms_metadata.get_ddl('PROCEDURE', 'ADD_JOB_HISTORY') 
  from dual;

CREATE OR REPLACE EDITIONABLE PROCEDURE "HR"."ADD_JOB_HISTORY" 
  (  p_emp_id          job_history.employee_id%type   
   , p_start_date      job_history.start_date%type   
   , p_end_date        job_history.end_date%type   
   , p_job_id          job_history.job_id%type   
   , p_department_id   job_history.department_id%type    
   )   
IS   
BEGIN   
  INSERT INTO job_history (employee_id, start_date, end_date,    
                           job_id, department_id)   
    VALUES(p_emp_id, p_start_date, p_end_date, p_job_id, p_department_id);   
END add_job_history; 

有更好的方法和更好的工具来实现您的目标 - 请参阅下文。

是否允许使用 SQL Developer 而不是 SQLPlus? SQL 开发人员有很好的功能,可以将 table 图标拖放到工作表中,然后系统会很好地提示您选择要查找的示例语句类型(SELECT、INSERT、更新等)- 选择一个后,您将获得示例语句。

不过最好的办法就是在浏览器中打开数据库SQL语言参考: https://docs.oracle.com/database/121/SQLRF/toc.htm