下面是用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异常怎么解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)