oracle常用笔记(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qinshi965273101/article/details/81943030

1、定义者权限,调用者权限

AUTHID DEFINER

定义者权限,

默认权限模式

程序以其拥有者身份(定义者)执行
AUTHID CURRENT_USER 调用者权限 不同schema,调用相同的程序,可以操作各自拥有的对象

举例说明两者的区别:

  • 把get_count和get_count2 在 sys用户下编译
--定义着权限
CREATE OR REPLACE FUNCTION get_count  RETURN NUMBER AUTHID DEFINER
IS
       table_count NUMBER;
BEGIN
      SELECT COUNT(*) INTO table_count FROM user_tables;
      RETURN table_count;
END;
/
--调用者权限
CREATE OR REPLACE FUNCTION get_count2 RETURN NUMBER AUTHID CURRENT_USER
IS
       table_count NUMBER;
BEGIN
      SELECT COUNT(*) INTO table_count FROM user_tables;
      RETURN table_count;
END;
/
  • 把get_count和get_count2授权给kdpif用户
grant execute on sys.get_count to kdpif;
grant execute on sys.get_count2 to kdpif;
  • 用sys和kdbase调用这两个函数

可以看出,在kdpif用户下执行 sys.get_count2(),调用的是kdpif的user_tables表

--在sys用户下执行
select get_count() from dual; --967
select get_count2() from dual; --967
--在kdpif用户下执行
select sys.get_count() from dual; --967
select sys.get_count2() from dual; --701

2、DBMS_LOB包 使用

操作 大字段,文件。

原文地址:https://blog.csdn.net/guoxilen/article/details/73470586

3、connect by使用

  • 使用原理

Connect by 后面的条件,用来控制循环的次数,循环扫描对应表的内容。

例1:select level from dual connect by level <= 10;

其中,Level<=10,即循环扫描 dual表十次,查询的结果集 level分别为1-10。

例2:select level,a.* from t_pro_cls a start with a.cls_id = 0 connect by prior a.cls_id = a.par_cls_id order by level

其中,par_cls_id 为父节点,cls_id为子节点,这是我们常用的级联查找:

执行逻辑:从 cls_id = 1 这条记录开始查询,另一条记录中的 par_cls_id 等于 这条记录中的 cls_id 作为条件,循环查找。

查询结果集中也可以写上level,作为查询的顺序。

  • 常用sql
--可以得到 列值为1-10的表数据
select level from dual connect by level <= 10;

--列出2008年所有日期及星期几
select to_date('20080101', 'yyyymmdd') + v_level - 1 rq, --日期
       to_char(to_date('20080101', 'yyyymmdd') + v_level - 1, 'day') day --星期
  from (select level v_level           
          from dual           
        connect by level <= to_date('20081231', 'yyyymmdd') - to_date('20080101', 'yyyymmdd') + 1);

--一行变多行,需注意多条数据处理时,会有重复记录
SELECT regexp_substr('1,2,3,4,5,6,7,8,9', '[^,]+', 1, level)
   FROM DUAL
 CONNECT BY level <= LENGTH('1,2,3,4,5,6,7,8,9') - LENGTH(REPLACE('1,2,3,4,5,6,7,8,9', ',', '')) + 1;

--级联查询的排序
select level, a.*
  from t_pro_cls a
 start with a.cls_id = 0
connect by prior a.cls_id = a.par_cls_id
 order by level

4、行转列PIVOT(常用于报表)

select * from
   (select goods_price,goods_number,goods_name
      from test_pivot)pivot(max(goods_price) as max_price, max(goods_number) as max_number 
                            for goods_name in('帽子' as mz, '鞋子' as xz, '衣服' as yf));

5、临时表

  • 临时表介绍

顾名思义,用于临时存放数据,用完之后数据被oracle清空。

临时表创建后基本不占用表空间。如果没有指定临时表存放的表空间,则默认存放在oracle系统的临时表空间中。

  • 临时表创建

--会话级临时表:
--在本次会话中才可以访问数据,会话结束临时表的数据会被截断。
Create Global Temporary Table test_temp1 
(Col1 integer,Col2 varchar2(32)) On Commit Preserve Rows;

--事务级临时表:
--当commit,rollback或者会话结束,临时表的数据会被截断。
 Create Global Temporary Table test_temp2 
(Col1 integer,Col2 varchar2(32)) On Commit Delete Rows;
  • 临时表删除

对于会话级临时表,必须先truncate ,才能drop。

对于事务级临时表,必须先commit ,才能drop。

  • 临时表须知

不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。

不支持主外键关系

6、create table as select 创建表的弊端

  • 使用该方式创建的表,不会把原来表的 默认值,主键,触发器等带过来。
  • 使用该方式创建的表,表数据都存储在临时表空间中。一旦数据过大,则会报temp表空间不足。

7、oracle 把汉字转为拼音简称

CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS
V_COMPARE VARCHAR2(100);
V_RETURN VARCHAR2(4000);

FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS
BEGIN
RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');
END;
BEGIN
FOR I IN 1..LENGTH(P_NAME) LOOP
V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));
IF V_COMPARE >= F_NLSSORT(' 吖 ') AND V_COMPARE <= F_NLSSORT('驁 ') THEN
V_RETURN := V_RETURN || 'A';
ELSIF V_COMPARE >= F_NLSSORT('八 ') AND V_COMPARE <= F_NLSSORT('簿 ') THEN
V_RETURN := V_RETURN || 'B';
ELSIF V_COMPARE >= F_NLSSORT('嚓 ') AND V_COMPARE <= F_NLSSORT('錯 ') THEN
V_RETURN := V_RETURN || 'C';
ELSIF V_COMPARE >= F_NLSSORT('咑 ') AND V_COMPARE <= F_NLSSORT('鵽 ') THEN
V_RETURN := V_RETURN || 'D';
ELSIF V_COMPARE >= F_NLSSORT('妸 ') AND V_COMPARE <= F_NLSSORT('樲 ') THEN
V_RETURN := V_RETURN || 'E';
ELSIF V_COMPARE >= F_NLSSORT('发 ') AND V_COMPARE <= F_NLSSORT('猤 ') THEN
V_RETURN := V_RETURN || 'F';
ELSIF V_COMPARE >= F_NLSSORT('旮 ') AND V_COMPARE <= F_NLSSORT('腂 ') THEN
V_RETURN := V_RETURN || 'G';
ELSIF V_COMPARE >= F_NLSSORT('妎 ') AND V_COMPARE <= F_NLSSORT('夻 ') THEN
V_RETURN := V_RETURN || 'H';
ELSIF V_COMPARE >= F_NLSSORT('丌 ') AND V_COMPARE <= F_NLSSORT('攈 ') THEN
V_RETURN := V_RETURN || 'J';
ELSIF V_COMPARE >= F_NLSSORT('咔 ') AND V_COMPARE <= F_NLSSORT('穒 ') THEN
V_RETURN := V_RETURN || 'K';
ELSIF V_COMPARE >= F_NLSSORT('垃 ') AND V_COMPARE <= F_NLSSORT('擽 ') THEN
V_RETURN := V_RETURN || 'L';
ELSIF V_COMPARE >= F_NLSSORT('嘸 ') AND V_COMPARE <= F_NLSSORT('椧 ') THEN
V_RETURN := V_RETURN || 'M';
ELSIF V_COMPARE >= F_NLSSORT('拏 ') AND V_COMPARE <= F_NLSSORT('瘧 ') THEN
V_RETURN := V_RETURN || 'N';
ELSIF V_COMPARE >= F_NLSSORT('筽 ') AND V_COMPARE <= F_NLSSORT('漚 ') THEN
V_RETURN := V_RETURN || 'O';
ELSIF V_COMPARE >= F_NLSSORT('妑 ') AND V_COMPARE <= F_NLSSORT('曝 ') THEN
V_RETURN := V_RETURN || 'P';
ELSIF V_COMPARE >= F_NLSSORT('七 ') AND V_COMPARE <= F_NLSSORT('裠 ') THEN
V_RETURN := V_RETURN || 'Q';
ELSIF V_COMPARE >= F_NLSSORT('亽 ') AND V_COMPARE <= F_NLSSORT('鶸 ') THEN
V_RETURN := V_RETURN || 'R';
ELSIF V_COMPARE >= F_NLSSORT('仨 ') AND V_COMPARE <= F_NLSSORT('蜶 ') THEN
V_RETURN := V_RETURN || 'S';
ELSIF V_COMPARE >= F_NLSSORT('侤 ') AND V_COMPARE <= F_NLSSORT('籜 ') THEN
V_RETURN := V_RETURN || 'T';
ELSIF V_COMPARE >= F_NLSSORT('屲 ') AND V_COMPARE <= F_NLSSORT('鶩 ') THEN
V_RETURN := V_RETURN || 'W';
ELSIF V_COMPARE >= F_NLSSORT('夕 ') AND V_COMPARE <= F_NLSSORT('鑂 ') THEN
V_RETURN := V_RETURN || 'X';
ELSIF V_COMPARE >= F_NLSSORT('丫 ') AND V_COMPARE <= F_NLSSORT('韻 ') THEN
V_RETURN := V_RETURN || 'Y';
ELSIF V_COMPARE >= F_NLSSORT('帀 ') AND V_COMPARE <= F_NLSSORT('咗 ') THEN
V_RETURN := V_RETURN || 'Z';
END IF;
END LOOP;
RETURN V_RETURN;
END;

8、批处理执行脚本

  • 批处理执行脚本的原理

例如:在D盘建一个 test.pdc 文件,里面是所有需要执行的脚本。文件里写的是两个@,后面跟文件相对路径或者绝对路径都可以,建议使用相对路径,这样不会被磁盘路径更改而影响。

创建一个test.bat去执行 test.pdc 中的脚本

其中执行脚本的语句为:sqlplus username/password@servicename @test.pdc > test.log

  •  批处理案例

通过批处理文件,生成pdc文件,用户名固定在脚本中,手动输入密码后,自动执行脚本,执行完成后自动检查错误。

批处理文件只处理了当前目录下的文件夹,且文件夹只能有一层。

文件名最好不要用特殊字符,文件内容编码也要注意,不能有乱码。

@echo off 
set pdcName=_commitFilePath

rem 1.先删除pdc文件
if not exist %pdcName%.pdc goto createPdc
del %pdcName%.pdc
echo 删除文件 %pdcName%.pdc 成功!

:createPdc
rem 2.再创建pdc文件(这里要包含所有类型的文件)
for /d %%i in (*) do (
	pushd %%i
	for %%j in (*) do echo @@%%i\%%j >> ..\%pdcName%.pdc
	popd
) 
echo exit; >> %pdcName%.pdc
echo 生成文件 %pdcName%.pdc 成功!

rem 数据库配置(用户名按目录位置更改)
set    db_user=kdetl
set /p db_password=请输入%db_user%用户密码:
set /p db_service=请输入数据库服务名:

echo 文件开始执行。。。。。。。
::  与当前文件同一个目录下的.sql文件写法
sqlplus %db_user%/%db_password%@%db_service% @%pdcName%.pdc>_%db_user%_runSql.log

@echo 执行完成,请查看_%db_user%_runSql.log日志文件以确认是否正确执行。
@echo off
findstr "ORA-" _%db_user%_runSql.log&&echo 发现ORA错误,请打开_%db_user%_runSql.log文件查看详细日志!||echo 执行成功,没有发现错误。
@echo off 
PAUSE

 

猜你喜欢

转载自blog.csdn.net/qinshi965273101/article/details/81943030