oracle 存储过程 递归实现 依赖分析

oracle 存储过程 递归实现 依赖分析,第1张

下面是用oracle数据库解决不用start with 来查询子父数据查询方法,里面主要用到了substr 和instr 函数(这两个函数,其他数据库也有相对应的函数),游标(其他数据库也有游标)。

-- 1 前提:创建表以及插入数据

CREATE TABLE TMP_TEST(MAIN_COLUMN VARCHAR2(10),PARENT_COLUMN VARCHAR2(10));

INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('A',NULL);

INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('B','A');

INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('C','A');

INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('D','A');

INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('E','B');

INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('F','C');

INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('G','E');

-- 2 创建存储过程

CREATE OR REPLACE PROCEDURE GET_TREE(IS_PARENT   IN NUMBER / 子父查询 /,

SEARCH_ID   IN VARCHAR2 / 查询条件节点 /,

TREE_RESOUT OUT VARCHAR2 / 输出结果集合 /)

AS

V_TEMP VARCHAR2(4000);

V_SEARCH VARCHAR2(4000);

V_INDEX INTEGER;

BEGIN

V_TEMP :=SEARCH_ID||'-';

TREE_RESOUT := '';

WHILE length(V_TEMP) > 0 LOOP

V_INDEX := instr(V_TEMP,'-');

V_SEARCH := substr(V_TEMP,0,V_INDEX-1);

V_TEMP := substr(V_TEMP,V_INDEX+1);

/DBMS_OUTPUTput_line('V_INDEX:'|| V_INDEX ||'V_TEMP:' ||V_TEMP||'V_SEARCH:'|| V_SEARCH);/

/ 查询子节点 /

if(IS_PARENT = 1) THEN

FOR C1 IN (SELECT FROM TMP_TEST T1 WHERE T1PARENT_COLUMN = V_SEARCH) LOOP

TREE_RESOUT := TREE_RESOUT || C1MAIN_COLUMN;

V_TEMP := V_TEMP || C1MAIN_COLUMN || '-';

END LOOP;

ELSE

/ 查询父节点 /

FOR C1 IN (SELECT FROM TMP_TEST T1 WHERE T1MAIN_COLUMN = V_SEARCH) LOOP

TREE_RESOUT := TREE_RESOUT || C1PARENT_COLUMN;

V_TEMP := V_TEMP || C1PARENT_COLUMN || '-';

END LOOP;

END IF;

END LOOP;

/DBMS_OUTPUTput_line('TREE_RESOUT:'||TREE_RESOUT);/

END;

-- 3 调用存储过程

declare

TREE_RESULT VARCHAR2(4000);

SEARCH_ID VARCHAR2(4000);

begin

get_tree(1,'A',TREE_RESULT);

dbms_outputput_line('查询子节点:' || TREE_RESULT);

get_tree(0,'G',TREE_RESULT);

dbms_outputput_line('查询父节点:' || TREE_RESULT);

end;

Oracle数据库管理员应按如下方式对Oracle数据库系统做定期监控

( ) 每天 对Oracle数据库的运行状态 日志文件 备份情况 数据库的空间使用情况 系统资源的使用情况进行检查 发现并解决问题

( ) 每周 对数据库对象的空间扩展情况 数据的增长情况进行监控 对数据库做健康检查 对数据库对象的状态做检查

( ) 每月 对表和索引等进行Analyze 检查表空间碎片 寻找数据库性能调整的机会 进行数据库性能调整 提出下一步空间管理计划 对ORACLE数据库状态进行一次全面检查

每天的工作

( ) 确认所有的INSTANCE状态正常登陆到所有数据库或例程 检测ORACLE后台进程: $ps –ef|grep ora

( ) 检查数据文件的状态记录状态不是 online 的数据文件 并做恢复

      Select file_name  status from dba_data_files where status= UNAVAILABLE ;

( ) 检查日志文件和trace文件记录alert和trace文件中的错误

连接到每个需管理的系统

使用 telnet 对每个数据库 cd到bdump目录 通常是$ORACLE_BASE//bdump 使用Unix tail 命令来查看alert_ log文件 如果发现任何新的ORA 错误 记录并解决

( ) 检查数据库当日备份的有效性

对RMAN备份方式: 检查第三方备份工具的备份日志以确定备份是否成功

对EXPORT备份方式: 检查exp日志文件以确定备份是否成功

对其他备份方式: 检查相应的日志文件

( ) 检查文件系统的使用(剩余空间) 如果文件系统的剩余空间小于 % 需删除不用的文件以释放空间

   $df –k

( ) 检查表空间的使用情况

       SELECT tablespace_name  max_m  count_blocks free_blk_cnt  sum_free_m to_char( sum_free_m/sum_m   ) ||  %  AS pct_free FROM (SELECT tablespace_name sum(bytes)/ /  AS sum_m FROM dba_data_files GROUP BY tablespace_name) (SELECT tablespace_name AS fs_ts_name  max(bytes)/ /  AS max_m  count(blocks) AS count_blocks  sum(bytes/ / ) AS sum_free_m FROM dba_free_space GROUP BY tablespace_name ) WHERE tablespace_name = fs_ts_name;

( ) 检查剩余表空间

  SELECT tablespace_name  sum ( blocks ) as free_blk   trunc ( sum ( bytes ) /( ) ) as free_m max ( bytes ) / ( ) as big_chunk_k  count () as num_chunks FROM dba_free_space GROUP BY tablespace_name;

( ) 监控数据库性能

运行bstat/estat生成系统报告或者使用statspack收集统计数据

( ) 检查数据库性能 记录数据库的cpu使用 IO buffer命中率等等

使用vmstat iostat glance top等命令

( ) 日常出现问题的处理

每周的工作

( ) 监控数据库对象的空间扩展情况

根据本周每天的检查情况找到空间扩展很快的数据库对象 并采取相应的措施

删除历史数据

扩表空间

alter tablespace add datafile size

调整数据对象的存储参数

  next extent pct_increase

( ) 监控数据量的增长情况

根据本周每天的检查情况找到记录数量增长很快的数据库对象 并采取相应的措施

删除历史数据

扩表空间

 alter tablespace add datafile   size

( ) 系统健康检查

检查以下内容:          

      init ora controlfile redo log file archiving sort area size tablespace(system temporary tablespace fragment) datafiles(autoextend location) object(number of extent next extent index) rollback segment logging &tracing(alert log max_dump_file_size sqlnet)

( ) 检查无效的数据库对象 

  col owner for a col object_name for a SELECT owner  object_name  object_type FROM dba_objects WHERE status=  INVALID ;

( ) 检查不起作用的约束

      SELECT owner  constraint_name  table_name  constraint_type  status FROM dba_constraints WHERE status =  DISABLED  AND constraint_type =  P  ;

( ) 检查无效的trigger 

      SELECT owner  trigger_name  table_name  status FROM dba_triggers WHERE status =  DISABLED ;

每月的工作

( ) Analyze Tables/Indexes/Cluster 

      yze table estimate statistics sample   percent;

( ) 检查表空间碎片

根据本月每周的检查分析数据库碎片情况 找到相应的解决方法;

( ) 寻找数据库性能调整的机会

比较每天对数据库性能的监控报告 确定是否有必要对数据库性能进行调整;

( ) 数据库性能调整

如有必要 进行性能调整;

( ) 提出下一步空间管理计划

lishixinzhi/Article/program/Oracle/201311/18051

一、EntityFramework事务 *** 作之TransactionScope

TransactionScope

位于using SystemTransactions;命名空间下,需要在引用中手动加入。该类不能被继承。

[csharp] view plain copy print在CODE上查看代码片派生到我的代码片

//

// 摘要:

// 使代码块成为事务性代码。此类不能被继承。

public sealed class TransactionScope : IDisposable

优点

1、使用起来比较方便.TransactionScope可以实现隐式的事务,使你可以在写数据访问层代码的时候不用考虑到事务,而在业务层的控制事务.

2、可以实现分布式事务,比如跨库或MSMQ

3在EntityFramework中可以解决DbContextTransaction的多个上下文出现死锁问题。也就是说在EF中使用TransactionScope事务时,不用考虑数据库 *** 作的多上下文问题。

使用实例如下:

[csharp] view plain copy print在CODE上查看代码片派生到我的代码片

Test1 _context = new Test1();

Test1 _context2 = new Test1();

using (TransactionScope tran = new TransactionScope())

{

try

{

//1修改省

Area province = _contextAreasFirstOrDefault(q => qAreaLevel == 1);

provinceAreaName = provinceAreaName + "1";

_contextSaveChanges();

ConsoleWriteLine(_context2AreasFirstOrDefault(q => qAreaLevel == 1)AreaName);

//2修改市

Area city = _context2AreasFirstOrDefault(q => qAreaLevel == 2);

cityAreaName = cityAreaName + "1";

_context2SaveChanges();

//抛出异常

throw new Exception("测试事务异常");

tranComplete();

}

catch (Exception ex)

{

ConsoleWriteLine("执行出错:" + exMessage);

}

}

特别说明:

1如果你的上下文在程序中只有一个,那么如果执行事务期间出现异常,也会出现数据模型和数据库中数据不对应情况。

1、首先lsnrctl stop并不是停止数据库,只是将监听端口停止

2、你可以复制一份回去试试cp /oradata/data01/zhfz_tbsdbf /oracle/product/102/oradata/ora10/zhfz_tbsdbf

3、正确改变tablespaces文件位置的步骤,假设database是正常运行的:

a)

select TABLESPACE_NAME,FILE_NAME from dba_data_files order by TABLESPACE_NAME;

b)

alter tablespace TS01 read only;

alter tablespace TS01 offline;

!cp /data1/oracle/ts01_1dbf /data2/oracle/ts01_2dbf

alter database rename file '/data1/oracle/ts01_1dbf' to '/data2/oracle/ts01_2dbf';

alter tablespace TS01 online;

alter tablespace TS01 read write;

4、shutdown immediate如果还不行,你可以用shutdown abort命令强制停止,这个办法比较暴力,startup时候用startup mount,然后进行正确的改变tablespaces文件位置的步骤。

然后再alter database open;

原因:

1、EF 、EFCore 中默认存在链接池,每次数据库 *** 作完成之后,会将连接丢到连接池。连接的释放过程单独管控(这里不做详细解释);

2、当Oracle数据库中设置有连接(会话)有效期时,到期后,Oracle服务端会中断连接,并将会话标识为:SNIPED状态;

注:查询数据中已超时,未释放的会话:select from v$session where status = 'SNIPED';

3、当Oracle数据库中连接超时后,EF连接池中的连接依然存在,若再次进行数据库 *** 作,则会提示 idle 超时异常;

解决方案:

方案1:调整数据库设置,将数据库中的“IDLE_TIME”设置未“UNLIMITED”,具体方式请自行百度;

可通过以下语句查看当前设置:

select username, b from dba_users a, dba_profiles b where aprofile = bprofile and username='IOT_SUB_ALL';

方案2:

在项目代码数据库连接字符串中添加:min pool size=0;设置,将EF连接池最小连接保持数设置为0(默认为1);

连接字符串样式:

"User Id=用户id;Password=密码;Data Source=IP:端口/服务器名;min pool size=0;"

连接字符串参数详细说明见:

>

支持。

Oracle 11g是在推出的最新数据库软件,Oracle 11g有400多项功能,经过了1500多个小时的测试,开发工作量达到了36万人/月,相当于1000名员工连续研发3年。

Oracle 11g提供了高性能、伸展性、可用性和安全性,并能更方便地在低成本服务器和存储设备组成的网格上运行 ,相对过往版本而言,Oracle 11g具有了与众不同的特性

Oracle创建与使用一般分下面几步:

1、创建数据库;

2、创建表空间,配置存放数据文件的目录;创建用户和数据表时需要用到表空间,最好创建单独的表空间;

3、创建用户,以后在程序中连接数据库时需要用到用户,系统用户如sys/system一般用于管理数据库;创建用户时需要选择表空间;

4、创建数据表,根据业务设计数据表和表间关系;创建数据表时需要选择用户和表空间;

5、建议安装数据库开发工具,本人用的是PL/SQL Developer,方便简洁,用于编写触发器、存储过程、sql语句等。

对于初学者,还是建议找一本oracle基础书籍看一看。

以上就是关于oracle 存储过程 递归实现 依赖分析全部的内容,包括:oracle 存储过程 递归实现 依赖分析、Oracle数据库管理员职责(一)、使用Entiry Framework *** 作Oracle中TransactionScope异常怎么解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9801466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存