当前位置:首页 » 编程语言 » oracle编程艺术sql
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oracle编程艺术sql

发布时间: 2023-03-12 11:41:11

A. oracle怎么直接执行sql语句

Oracle可以使用SQL Plus进行执行,但是可视化不够,建议使用另外一个查询辅助工具PLSQL Developer,使用PLSQL Developer工具里面各种可视化都很好看出查询出数据的结果以及可以用这个工具分析SQL的执行分析。

B. 求推荐一本Oracle学习教程

Oracle白金级入门教程网络网盘免费资源在线学习

链接: https://pan..com/s/12GelRT8Dr4xy6XtVfK5bmQ

?pwd=rfhp 提取码: rfhp

Oracle白金级入门教程 鸿鹄论坛_阶段8-RAC高可用集群.rar

鸿鹄论坛_阶段7-数据库性能优化.rar

鸿鹄论坛_阶段6-DataGuard容灾.rar

鸿鹄论坛_阶段5-Oracle备份还原恢复.rar

鸿鹄论坛_阶段4-Oracle体系结构.rar

鸿鹄论坛_阶段3-PL-SQL编程.rar

鸿鹄论坛_阶段2-SQL结构查询语言.rar

鸿鹄论坛_阶段1-Oracle数据库的安装与介绍.rar

C. oracle 存储过程执行动态sql实例

oracle的动态sql是指在语句块使用execute immediate 执行sql语句,sql语句可以使用存储过程传的参数进行拼接,本文针对varchar2和number两种类型的参数类型,进行sql拼接并执行。

功能:输入日期区间,销售数量满足上限和下限的产品id

1.正常传值

输出结果

2.若果number类型的参数传空,会报ora-00936:缺失表达式,可以在存储过程中增加对参数null值的判断

oracle 动态拼接传入参数,varchar2类型可以使用'''|| IN_START_DTIME || ''' ,number类型可以使用'||IN_DOWN_LIMIT||' ; 拼接的过程需要注意校验参数的合法性,增加存储过程的容错性。临时表使用了会话级,存储过程执行完,可以通过查询存储过程获取结果。

D. oracle是用什么语言是SQL语言吗

不一样的。

Oracle数据库内核是用c编写的,但是,大部分代码是在数据库中执行的,使用PL/SQL和Java(使用嵌入在内核中的jvm)开发。外围工具(SQLDeveloper,grid控件)主要使用Java。

MySQL是用C和c++编写的。它的SQL解析器是用yacc编写的,但是它使用一个定制的词法分析器。MySQL可以在很多系统平台上工作。

(4)oracle编程艺术sql扩展阅读:

Oracle文件结构:

数据库的物理存储结构由多种物理文件组成,主要包括数据文件、控制文件、重做日志文件、归档日志文件、参数文件、密码文件、警告文件等。

1.控制文件:存储诸如实例、数据文件和日志文件等信息的二进制文件。改变系统设置control_files='path'。VCONTROLFILE美元。

2.数据文件:存储数据。DBF后缀。一个语句:一个表空间用于多个数据文件,一个数据文件用于一个表空间。Dba_data_files/v$丢失。

3.日志文件:重做日志文件和Archivelog文件。记录数据库修改信息。ALTER系统切换日志文件;。V$日志。

4.参数文件:记录基本参数。Spfilepfile。

5.警告文件:显示参数background_mp_dest——使用共享服务器连接。

6.跟踪文件:显示参数user_mp_dest——使用专用服务器连接。

E. oracle plsql什么时候使用自治事务

了解oracle自治事务
1、什么是Oracle自治事务
在官方文档中,是这样的定义的“Autonomous transactions are independent transactions that can be called from within another transaction.”就是说它被一个事务调用的事务,但它独立于它的父事务提交或回滚。
下面看一个例子
首先创建一张测试表
www.2cto.com
[sql]
MIKE@ORA11G> create table test(m varchar2(30));Table created.
创建两个procere,一个是自治事务的,一个是非自治事务的[sql]
create or replace procere auto_proce
as
pragma autonomous_transaction;
begin
insert into test values('autonomous!');
commit;
end;
/
[sql]
create or replace procere nonauto_proceas www.2cto.com
begin
insert into test values('nonautonomous!');commit;
end;
/
先调用nonauto_proce,看一下会发生什么?
[sql]
SQL> select * from test;
未选定行
SQL> begin
2 insert into test values('test');
3 nonauto_proce;
4 rollback;
5 end;
6 /
PL/SQL 过程已成功完成。
SQL> select * from test;
www.2cto.com
M
------------------------------
test
nonautonomous!
第4行的rollback并没有回滚,由于nonauto_proce过程不是自治事务,它的提交将父事务中的insert一并提交,造成rollback没有回滚,即nonauto_proce影响了它的父事务。
下面再看一下auto_proce的情况。
[sql]
SQL> truncate table test;
表被截断。
SQL> select * from test;
未选定行
SQL> begin
2 insert into test values('test1');
3 auto_proce;
4 rollback;
5 end;
6 /
PL/SQL 过程已成功完成。
SQL> select * from test;
www.2cto.com
M
------------------------------
autonomous!
由于auto_proce过程是自治事务,它的commit并没有影响到其父事务的rollback。从结果中,已经证明了这一点。
通过这个例子,可以看出自治事务对其父事务并不会造成任何影响。
自治事务一般会被用于:
a 匿名块
b 本地、对立或打包的函数或过程
c 对象类型的方法
d 触发器
2、自治事务与父事务(调用者)的关系
创建一个过程,在commit前休眠10秒,以便查看系统中的一些信息。
[sql]
create or replace procere auto_p1
as
pragma AUTONOMOUS_TRANSACTION;
begin
insert into test values('test2');
dbms_lock.sleep(10);
commit;
end;
查看会话的SID(会话A)
www.2cto.com
[sql]
SQL> conn sys/admin as sysdba
已连接。
SQL> select sid from v$mystat where rownum=1;SID
----------
144
通过sqlplus打开另一个连接(会话B),查看会话信息[sql]
SQL> select sid, username, status from v$session;SID USERNAME STATUS---------- ------------------------------ --------138 ACTIVE143 SYS INACTIVE144 SYS INACTIVE145 SYS INACTIVE147 SYS ACTIVE149 ACTIVE151 ACTIVE157 ACTIVE159 ACTIVE160 ACTIVE161 ACTIVEwww.2cto.com
在会话A执行auto_p1
[sql]
SQL> begin
2 auto_p1;
3 end;
4 /
PL/SQL 过程已成功完成。
执行期间在会话B,查看会话信息
[sql]
SQL> select sid, username, status from v$session;SID USERNAME STATUS---------- ------------------------------ --------143 SYS INACTIVE144 SYS INACTIVE145 SYS INACTIVE147 SYS ACTIVE149 ACTIVE151 ACTIVE157 ACTIVE160 ACTIVE161 ACTIVE162 ACTIVE163 ACTIVE并没有看到新的会话产生,即自治事务auto_p1与其父事务(匿名块)在同一会话中。
www.2cto.com
3、应用场景
在Tom大师的《Oracle编程艺术》中,提到了这方面的内容 – 记录错误日志或者消息。想想做过的项目中,的确自治事务主要应用在这方面比较多,不管你的请求是否成功,只要访问到数据库,就要记录在案,使用自治事务是一种比较不错的方案(当然还有其他方案,因为此处只说自治事务,其他方案略过)。
还有队列消息等基础数据库的消息类系统,也可以使用自治事务来记录消息的发送,实际上也是日志的记录。
下面使用一个简单的例子,说明一下。
创建两张表,一张测试表(有主键),一张是测试表的错误日志信息表。
[sql]
SQL> create table test1
( id number(8),
msg varchar2(10),
constraint test1_pk primary key(id)
);
表已创建。
[sql]
SQL> create table test1_log
2 ( dat timestamp,
3 err clob
4 );
表已创建。
创建自治事务,用于记录操作测试表时出现的错误信息。
[sql]
SQL> create or replace procere log_err(errinfo varchar2)2 as
3 pragma autonomous_transaction;
4 begin
5 insert into test1_log values(systimestamp, errinfo);6 commit;
7 end;
8 / www.2cto.com
过程已创建。
创建一个过程用于向测试进行插入操作。
[sql]
SQL> create or replace procere insert_test(numid number, msg varchar2)2 as
3 begin
4 insert into test1 values (numid, msg);5 end;
6 /
过程已创建。
向测试表插入数据(没有错误信息的情况)。
[sql]
SQL> begin
2 insert_test(1,'testtest');
3 insert_test(2,'test');
4 exception
5 when others
6 then
7 log_err(dbms_utility.format_error_backtrace);8 raise;
9 end;
10 /
PL/SQL 过程已成功完成。
[sql]
SQL> select * from test1_log;
www.2cto.com
未选定行
错误日志表中没有信息,测试表中的数据都是正确的。
下面再进行插入操作(违反测试表的主键约束,出现错误的情况)。
[sql]
SQL> begin
2 insert_test(1,'ffffffff');
3 exception
4 when others
5 then
6 log_err(dbms_utility.format_error_backtrace);7 raise;
8 end;
9 /
begin
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SYS.TEST1_PK)ORA-06512: 在 line 7
[sql]
SQL> set linesize 1000
SQL> select * from test1_log;
www.2cto.com
DAT
ERR--------------------------------30-7月 -12 07.55.26.281000 下午 ORA-06512: 在 "SYS.INSERT_TEST", line 4ORA-06512: 在 line 2
插入操作没有成功,测试表没有新插入的数据,但是错误日志表中,记录个这次插入操作的错误信息。
上面的例子非常简单,运用到应用系统中,还需要根据系统的需求进行改造。

F. Oracle定义事务的SQL语句

SQL>
select
*
from
test_main;
ID
VALUE
----------
--------------------
2
TWO
3
THREE
1
ONE
SQL>
BEGIN
2
--
插入2条同样的数据,使主键重复,引发错误后回滚事务.
3
INSERT
INTO
test_main(id,
value)
VALUES
(4,
'FOUR');
4
INSERT
INTO
test_main(id,
value)
VALUES
(4,
'FOUR');
5
COMMIT;
6
EXCEPTION
7
WHEN
OTHERS
THEN
8
dbms_output.put_line('Error
Code
=
'
||
TO_CHAR(SQLCODE)
);
9
dbms_output.put_line('Error
Message
=
'
||
SQLERRM
);
10
--
回滚事务
11
ROLLBACK;
12
END;
13
/
PL/SQL
procere
successfully
completed.
SQL>
select
*
from
test_main;
ID
VALUE
----------
--------------------
2
TWO
3
THREE
1
ONE
SQL>