Oracle sqlplus 使用踩坑记

2019年07月23日 09:51 · 阅读(1303) ·

[目录]

参考

ORA-01034: ORACLE not available如何解决

sqlplus连接的三种方式

sqlplus执行SQL文件

故事起源

我本地是使用 PLSQL Developer 进行数据库操作,包括表创建/修改,视图创建/修改,存储过程修改,序列创建等。

但是发布的时候,DBA 是使用命令行发布的。

这导致我本地创建的有些脚本在本地使用 PLSQL Developer 执行没有问题,发布的时候使用命令行执行,就会出很多问题

比如说下面的 sql

  1. --创建表
  2. create table ITEMVALUE_CONFIG
  3. (
  4. ID number, --ID
  5. KEY varchar2(255),--配置项
  6. VALUE varchar2(255) --配置值
  7. );
  8. --表注释
  9. comment on table ITEMVALUE_CONFIG is '调整类型配置表';
  10. --字段注释
  11. comment on column ITEMVALUE_CONFIG.ID is '自增列';
  12. comment on column ITEMVALUE_CONFIG.KEY is '配置项';
  13. comment on column ITEMVALUE_CONFIG.VALUE is '配置值';

在本地执行没有任何问题,可以使用命令行一执行,报下面的错误

于是我想在我本地使用 sqlplus 来执行我的 sql,没问题之后再发给 DBA,这样我的脚本就不会老报错了。

但是在我本地使用 sqlplus 的过程中,遇到很多问题,至今都没有解决,这里做个记录。

使用 sqlplus 输入密码问题

使用管理员权限打开命令提示符,输入 sqlplus

注意的是输入口令的时候,界面是没有反应的,你输入之后按回车就可以了

  1. Microsoft Windows [版本 10.0.17134.885]
  2. (c) 2018 Microsoft Corporation。保留所有权利。
  3. C:\WINDOWS\system32>sqlplus
  4. SQL*Plus: Release 11.2.0.1.0 Production on 星期二 7 23 09:33:40 2019
  5. Copyright (c) 1982, 2010, Oracle. All rights reserved.
  6. 请输入用户名: sys
  7. 输入口令:
  8. ERROR:
  9. ORA-01034: ORACLE not available
  10. ORA-27101: shared memory realm does not exist
  11. 进程 ID: 0
  12. 会话 ID: 0 序列号: 0

sqlplus 用户名问题

从上面的问题中我们看到,输入 sys 这个用户不行!我又尝试了 sysdba 这个用户,还是不行

  1. 请输入用户名: sys
  2. 输入口令:
  3. ERROR:
  4. ORA-01034: ORACLE not available
  5. ORA-27101: shared memory realm does not exist
  6. 进程 ID: 0
  7. 会话 ID: 0 序列号: 0
  8. 请输入用户名: sysdba
  9. 输入口令:
  10. ERROR:
  11. ORA-01034: ORACLE not available
  12. ORA-27101: shared memory realm does not exist
  13. 进程 ID: 0
  14. 会话 ID: 0 序列号: 0

于是我看到了一篇文章 ORA-01034: ORACLE not available如何解决,里面使用了 sys as sysdba 这个用户,我尝试了下,竟然可以

  1. 请输入用户名: sys as sysdba
  2. 输入口令:
  3. 已连接到空闲例程。

连接到指定数据库

参考了这篇文章 sqlplus连接的三种方式

一开始我是这样连接的,注意下面的语句中 luoma 是用户名,testdb 是数据库名称(在 tnsnames.ora 中配置的数据库名称)

  1. SQL> connect luoma@testdb as sysdba
  2. 输入口令:
  3. ERROR:
  4. ORA-01017: invalid username/password; logon denied
  5. SQL> connect luoma@testdb normal
  6. SP2-0306: 选项无效。
  7. 用法: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]]
  8. 其中 <logon> ::= <username>[/<password>][@<connect_identifier>]
  9. <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]

接着我根据提示修改

  1. SQL> connect luoma@testdb
  2. 输入口令:
  3. 已连接。
  4. SQL>

在 sqlplus 中执行脚本文件

@命令说明

@ 等于 start 命令,用来运行一个 sql 脚本文件
@命令调用当前目录下的,或指定全路径,或可以通过 SQLPATH 环境变量搜寻到的脚本文件。该命令使用是一般要指定要执行的文件的全路径,否则从缺省路径(可用 SQLPATH 变量指定)下读取指定的文件。

D:\Temp\DBScript 目录下创建 sql 文件 01_crt_table_item_config.sql,内容如下

  1. --创建表
  2. create table ITEMVALUE_CONFIG
  3. (
  4. ID number, --ID
  5. KEY varchar2(255),--配置项
  6. VALUE varchar2(255) --配置值
  7. );
  8. --表注释
  9. comment on table ITEMVALUE_CONFIG is '调整类型配置表';
  10. --字段注释
  11. comment on column ITEMVALUE_CONFIG.ID is '自增列';
  12. comment on column ITEMVALUE_CONFIG.KEY is '配置项';
  13. comment on column ITEMVALUE_CONFIG.VALUE is '配置值';

连接到指定数据库

  1. SQL> connect luoma@testdb
  2. 输入口令:
  3. 已连接。
  4. SQL>

接着执行这个 sql 脚本

  1. SQL> connect luoma@testdb
  2. 输入口令:
  3. 已连接。
  4. SQL> @D:\Temp\DBScript\01_crt_table_item_config.sql
  5. 表已创建。
  6. 注释已创建。
  7. 注释已创建。
  8. 注释已创建。

一开始提出的那个问题,可以通过这种方式来验证了。

在 sqlplus 中执行 sql

  1. SQL> select sysdate from dual;
  2. SYSDATE
  3. --------------
  4. 23-7 -19
  5. SQL> select * from itemvalue_config;
  6. 未选定行
  7. SQL> drop table itemvalue_config;
  8. 表已删除。

sqlplus 执行创建视图出现奇怪提示

我创建了一个视图,名称为 06_tpsdata_crt_view_tax_bureau_corporate_tax.sql

在 sqlplus 中执行,也没有报错,但是输出了一堆东西,貌似是执行的结果,也执行成功了。

原因:视图中 union all 前后出现了空行

去掉空行之后,执行成功。

sqlplus 执行创建视图出现异常提示-ORA-00900: 无效 SQL 语句

我创建了一个视图,名称为 06_tpsdata_crt_view_tax_bureau_corporate_tax.sql

这个问题更奇怪,在 PLSQL 里面用 command window 执行 sql 语句正常,但是用 sqlplus 执行,报错

  1. ORA-00900: 无效 SQL 语句

原因:视图中 where 条件中出现了空行

去掉这个空行之后,执行成功