oracle中plsql与sqlplus的区别是啥啊?它们分别用来做啥啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中plsql与sqlplus的区别是啥啊?它们分别用来做啥啊?相关的知识,希望对你有一定的参考价值。

一、SQL Plus是oracle提供的一种用户接口。类似于操作系统的命令行。用户可以通过在SQL Plus中输入命令来向数据库发 送命令,数据库也将处理结果通过SQL Plus呈现给用户。是数据库和用户的交互工具。
二、PL/SQL则是oracle的过程化编程语言,定义了大量语法,用户可以遵循这些语法来定义程序块,以完成复杂的数据库操作。这些代码块可以作为数据库对象进行存储,有利于实现代码复用。程序块开发工作,照样可以在用户工具SQL Plus上完成。
参考技术A PLSQL是第三方公司为ORACLE使用人员开发的一个UI程序,好用,可以对ORACLE的性能和一些特性的东西提供了解决方案。SQLPLUS是ORACLE公司的随机安装产品,不太好用本回答被提问者采纳

Oracle plsql switch case 和 sqlplus spool

【中文标题】Oracle plsql switch case 和 sqlplus spool【英文标题】:Oracle plsql switch case and sqlplus spool 【发布时间】:2016-03-31 09:23:11 【问题描述】:

以下查询在 THAN 语句处运行时出错。是否可以在 THAN 语句中使用选择?关于如何使其工作的任何想法?

SET SERVEROUTPUT ON
SET TERMOUT  OFF
SET ECHO     OFF
SET FEEDBACK OFF
SET LINESIZE 140
SET PAGESIZE 0  

exec dbms_output.enable(NULL);

SPOOL C:\test\user.sql

BEGIN

SELECT DISTINCT version,
  CASE
  WHEN version = '12.1.0.2.0' 
  THEN 
     dbms_output.put_line(''select' || 'Alter user ' || username || ' identified by values ' ||  '''EE3FD1E715941451''' || ';''); from DBA_USERS_WITH_DEFPWD;
  ELSE 
     dbms_output.put_line(''select' || 'Alter user ' || username || ' identified by values ' ||  '''Invalid Password''' || ';''); from DBA_USERS_WITH_DEFPWD;
FROM PRODUCT_COMPONENT_VERSION;
END; 

SPOOL OFF

编辑:

正在运行的代码如下所示:

spool c:/test/user.sql

select 'Alter user ' || username || ' identified by values ' ||  '''Invalid Password''' || ';'
   from DBA_USERS_WITH_DEFPWD;

spool off

假脱机输出示例:

Alter user GSMUSER identified by values 'Invalid Password';
Alter user MDSYS identified by values 'Invalid Password';
Alter user OLAPSYS identified by values 'Invalid Password';
Alter user LBACSYS identified by values 'Invalid Password';

该脚本不适用于新的 Oracle 数据库版本。自 Oracle 12.1.0.2.0 起,无法将密码设置为无效密码。我需要为这个问题建立版本识别。所有版本低于 12.1.0.2.0 的 Oracle 数据库都应使用旧脚本处理,密码应设置为“无效密码”。现在所有较新的版本都应该获得某种标准密码。

【问题讨论】:

您不能在 SELECT 语句中使用 DBMS_OUTPUT。您正在混合 SQL 和 PL/SQL。它们是不同的引擎。此外,您的 SELECT 语句实际上没有任何意义。用恰当的语言解释您的要求。 您能否发布一些示例数据和想要的结果? @LalitKumarB 他正在尝试这样做:***.com/questions/36302810/… 你遇到了什么错误? @Sathya 我明白了……他删除了那个问题。 【参考方案1】:

也许你需要这样的东西:

...
DECLARE
    vVersion varchar2(100);
BEGIN    
    /* get the version */
    SELECT DISTINCT version
    into vVersion
    from PRODUCT_COMPONENT_VERSION;
    --
    /* loop through users */
    for i in ( select * from DBA_USERS_WITH_DEFPWD) loop
        /* print a different statement, based on vVersion, for the current user */
        if ( vVersion = '12.1.0.2.0' ) then
            dbms_output.put_line('Alter user ' || i.username || ' identified by values ' ||  '''EE3FD1E715941451''' || ';');
        else
            dbms_output.put_line('Alter user ' || i.username || ' identified by values ' ||  '''Invalid Password''' || ';');
        end if;
    end loop;
END; 
...

【讨论】:

谢谢,这就是我想要做的。执行脚本仍然给我一些问题。它要求我声明版本和用户名。可以通过将 if ( version = '12.1.0.2.0' ) 更改为 if ( vVersion = '12.1.0.2.0' ) 来修复版本。但我无法修复用户名。目前它似乎没有从 DBA_USERS_WITH_DEFPWD 获取用户名。我还没有找到解决这个问题的方法。 需要使用 SET SERVEROUTPUT ON 来获取到 spool 的输出。【参考方案2】:

另一个解决问题的版本没有 PL/SQL 和正确的假脱机:

SET TERMOUT  OFF
SET ECHO     OFF
SET LINESIZE 140
SET FEEDBACK OFF
SET PAGESIZE 0

SPOOL user.sql

SELECT    'alter user ' || username || ' identified by values '''
       || CASE
             WHEN b.version = '12.1.0.2.0' THEN '462368EA9F7AD215'
             ELSE 'Invalid Password'
          END
       || ''';'
  FROM DBA_USERS_WITH_DEFPWD a,
       (SELECT VERSION
          FROM PRODUCT_COMPONENT_VERSION
         WHERE UPPER (product) LIKE '%DATABASE%') b;

SPOOL OFF
@user.sql

【讨论】:

【参考方案3】:

如果不能使用 PL/SQL:

SET TERMOUT  OFF
SET ECHO     OFF
SET LINESIZE 140
SET FEEDBACK OFF
SET PAGESIZE 0

spool user.sql

SELECT    'Alter user '
       || A.USERNAME
       || ' identified by values '
       || '''EE3FD1E715941451'''
       || ';'
  FROM DBA_USERS_WITH_DEFPWD a,
       (SELECT DISTINCT version
          FROM PRODUCT_COMPONENT_VERSION) b
 WHERE version = '12.1.0.2.0'
UNION ALL
SELECT    'Alter user '
       || A.USERNAME
       || ' identified by values '
       || '''Invalid Password'''
       || ';'
  FROM DBA_USERS_WITH_DEFPWD a,
       (SELECT DISTINCT version
          FROM PRODUCT_COMPONENT_VERSION) b
 WHERE version != '12.1.0.2.0';


 spool off
 @user.sql

【讨论】:

以上是关于oracle中plsql与sqlplus的区别是啥啊?它们分别用来做啥啊?的主要内容,如果未能解决你的问题,请参考以下文章

oracle用sql plus登陆不了,但是用pl sql可以登录,是啥原因?

pl/sql里面命令窗口和sql窗口区别是啥?

SQLPLUS能连接oracle10g,PLSQL也能连,但网页程序却报错ORA-12154: TNS: 无法解析指定的连接标识符

pl/sql 中选中一行的快捷键是啥?

用plsql向oracle10g导入bmp文件的数据,总是闪一下,查看plsql日志报这个错是啥意思啊

Oracle plsql switch case 和 sqlplus spool