<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; Oracle</title>
	<atom:link href="https://blog.gmem.cc/category/work/database/oracle/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Fri, 03 Apr 2026 04:13:36 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Oracle PL/SQL开发学习笔记</title>
		<link>https://blog.gmem.cc/oracle-plsql-study-note</link>
		<comments>https://blog.gmem.cc/oracle-plsql-study-note#comments</comments>
		<pubDate>Mon, 22 Oct 2007 06:33:10 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1899</guid>
		<description><![CDATA[<p>基本知识 脚本中的斜线“/”的作用是什么：用于隔断DDL语句 长度为0 的字符串作为null处理：'str' &#124;&#124; null、'str' &#124;&#124; '' 这两个表达式的值均为'str' 布尔类型 TURE FALSE NULL 可以有三个值，布尔型只能用于计算，不能插入表 GOTO语句不能跳到IF、LOOP语句或者子块，不能跳出子程序，不能从异常处理跳到当前块 存储过程调用命令：exec。代码里面不需要写exec。在java代码里面使用这种方式：{call procedure_name ...} 异常传播机制类似JAVA，向上级块传播 PL/SQL语法 以下代码示意PL/SQL的语法 [crayon-69d195e31092c167833013/] <a class="read-more" href="https://blog.gmem.cc/oracle-plsql-study-note">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/oracle-plsql-study-note">Oracle PL/SQL开发学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h2"><span class="graybg">基本知识</span></div>
<ol>
<li>脚本中的斜线“/”的作用是什么：用于隔断DDL语句</li>
<li>长度为0 的字符串作为null处理：'str' || null、'str' || '' 这两个表达式的值均为'str'</li>
<li>布尔类型 TURE FALSE NULL 可以有三个值，布尔型只能用于计算，不能插入表</li>
<li>GOTO语句不能跳到IF、LOOP语句或者子块，不能跳出子程序，不能从异常处理跳到当前块</li>
<li>存储过程调用命令：exec。代码里面不需要写exec。在java代码里面使用这种方式：{call procedure_name ...}</li>
<li>异常传播机制类似JAVA，向上级块传播</li>
</ol>
<div class="blog_h2"><span class="graybg">PL/SQL语法</span></div>
以下代码示意PL/SQL的语法<br />
<pre class="crayon-plain-tag">/*
多行注释
*/
DECLARE
  -- 声明变量：变量名由 0-9A-Za-z # $ _ 组成，最大30个字符。可以带双引号，以包含其他字符
 V_NAME VARCHAR2(32);
  -- 声明常量，赋初始值
 V_ORG_CODE CONSTANT NUMBER(8) := 876;
  -- 定义子类型（自定义类型），不能指定长度和精度
 SUBTYPE MY_TYPE IS NUMBER;
  -- 定义记录类型
  TYPE USER_RECORD (
    NAME VARCHAR2(32) := '''' || '"', --字符串连接
    ID NUMBER(21) NOT NULL := 6.02E23,
    GENDER NUMBER(1) NOT NULL DEFAULT 1,
    STAFF_CODE R$USER.STAFF_CODE%TYPE
  )
   -- 声明记录类型变量
  V_USERS USER_RECORD;
   --定义表类型，表是类似于数组的（indexed）结构。index by 说明其索引（下标）的类型
  TYPE NAME_TABLE IS TABLE OF R$USER%ROWTYPE INDEX BY BINARY_INTEGER;
   -- 声明表类型变量
  V_USER_TAB  NAME_TABLE;
   -- 声明显式游标，可以绑定参数
  CURSOR C_USER(P_ID R$USER.USER_ID%TYPE) IS
    SELECT ID,STAFF_CODE,USER_NAME FROM R$USER WHERE ORG = 876 AND P_ID != P_ID;

    --定义异常类型
  E_AUTH_ERR EXCEPTION;  
    --异常初始化的编译指令（对应oracle错误号 ora-01401）
    PRAGMA EXCEPTION_INIT(E_AUTH_ERR ,-1401)
  V_LOOP_COUNT BINARY_INTEGER := 1;
BEGIN
  -- 命名的子块
  &lt;&lt;SUB_BLOCK&gt;&gt;
  DECLARE
    V_VAR NUMBER DEFAULT 12;
  BEGIN
    SUB_BLOCK.V_VAR := 0; -- 可以用这种方式引用父块中的变量
  END SUB_BLOCK;
    --  表类型元素赋值
  V_USER_TAB(-3).USER_NAME  := 'WangZhen';
    --  表属性
    V_USER_TAB.COUNT;--  返回总数
  V_USER_TAB.DELETE; --  删除全部
  V_USER_TAB.DELETE(i); --  删除指定
  V_USER_TAB.DELETE(i,j);  --  删除范围，包含i j
  V_USER_TAB.EXIST(i); 
--  是否存在
  V_USER_TAB.FIRST;
  V_USER_TAB.LAST;
  V_USER_TAB.NEXT(i);
  V_USER_TAB.PRIOR(i);
  
  -- select into 赋值
  SELECT USER_NAME INTO V_NAME FROM R$USER WHERE ID = 10000;
  -- IF-ELSE IF -ELSE结构
  IF V_NAME = 'ADMIN' THEN
    NULL;
  ELSIF V_NAME IS NULL THEN
    NULL;
  ELSE
    NULL;
  END IF;
  -- LOOP -EXIT WHEN循环
  LOOP
    INSERT INTO TAB0 VALUES( V_LOOP_COUNT );
    V_LOOP_COUNT := V_LOOP_COUNT + 1;
    EXIT WHEN V_LOOP_COUNT &gt; 100;
    IF V_LOOP_COUNT &gt; 100 THEN
      EXIT;
    END IF;
  END LOOP;
    -- WHILE - LOOP循环
  WHILE V_LOOP_COUNT &lt;= 100 LOOP
  END LOOP;
  -- FOR循环
  FOR V_COUNT IN 1..100 LOOP
    INSERT INTO TAB0 VALUES( V_LOOP_COUNT );
  END LOOP;
  -- 带标号的循环
    &lt;&lt;OUTER&gt;&gt;
  LOOP
    LOOP
      OUTER.variable := 1;
      IF OUTER.variable = 1 THEN
        GOTO PRINT;  
      END IF;
    END LOOP;
    &lt;&lt;PRINT&gt;&gt;
  END LOOP OUTER;
  -- 操作显式游标，FETCH用于推进游标。%FOUND %NOTFOUND %ISOPEN %ROWCOUNT表示已经读取的行数
  OPEN C_USERS(10000);
  LOOP
    FETCH C_USERS INTO V_ID,V_STAFF_CODE,V_USER_NAME;
        -- 注意，fetch后面只能跟游标的名称
    FETCH C_USERS INTO V_RECORD;
    EXIT WHEN C_USERS%NOTFOUND;
  END LOOP;
  CLOSE C_USERS;
  -- 显式游标FOR循环，不用打开、关闭。V_USER不需要显式声明
    FOR V_USER IN C_USERS LOOP
    DELETE FROM R$USER  WHERE CURRENT OF C_USERS ; -- 更新当前游标（需要for update）
  END LOOP;
  -- 隐式声明显式游标
    FOR V_USER IN  (SELECT * FROM R$USER) LOOP
    NULL;
  END LOOP;
  -- 隐式游标（SQL游标）   可以访问属性 %FOUND %NOTFOUND %ROWCOUNT
    UPDATE R$USER SET USER_NAME = 'admin' WHERE ID = 10000;
  V_EXIST := SQL%FOUND;
    -- 抛出异常(内置或者已经声明)
  RAISE E_AUTH_ERR;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    -- 抛出异常(未声明的) 错误号在-20000 到 -20999，错误文本最大512字符
    RAISE_APPLICATION_ERROR(-20001,'ERROR MESSAGE!');
    DBMS_OUTPUT.PUT_LINE('ERROR!!');
        -- select into 返回0行时抛出
  WHEN TOO_MANY_ROWS THEN
    v_errcode := SQLCODE;
    v_errmsg := SQLERRM;
    -- select into 返回多行时抛出 
    WHEN OTHERS THEN
    NULL;
END;
-- 存储过程声明语法
CREATE OR REPLACE PROCEDURE my_procedure (
    -- 参数不能指定精度或者长度
    p_name in varchar2, 
    p_staff_code in out varchar2
) IS
    v_var number;
BEGIN
    NULL;
END my_procedure;
-- 存储过程调用语法
my_procedure(
   v_name,-- 位置传参方式
   p_staff_code =&gt; v_staff_code -- 名称传参方式
);
-- 存储函数：可以作为一个表达式调用，没有参数，则声明和定义都不需要()括号
CREATE OR REPLACE FUNCTION my_func (
   -- 参数不能指定精度或者长度
   p_name in varchar2, 
   p_staff_code in out varchar2
)
RETURNS number
IS
   v_var number;
BEGIN
   NULL;
END my_func;</pre>
<div class="blog_h2"><span class="graybg">常用代码样板</span></div>
<div class="blog_h3"><span class="graybg">伪随机函数</span></div>
<pre class="crayon-plain-tag">-- DBMS_RANDOM包含若干与随机数相关的函数
-- 生成一个随机数
SELECT ABS(MOD(DBMS_RANDOM.RANDOM, 3600)) FROM DUAL
-- 随机字符串和随机数字
BEGIN
  FOR V_COUNT IN 1 .. 1000 LOOP
    INSERT INTO PFMS_TEST
      ( ID, NAME , AGE)
    VALUES
      (WSO2_SEQ.NEXTVAL,
       DBMS_RANDOM.STRING( 'A', 100 ),
       TRUNC(DBMS_RANDOM.VALUE(0 , 100)));
  END LOOP;
  COMMIT;
END;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/oracle-plsql-study-note">Oracle PL/SQL开发学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/oracle-plsql-study-note/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle数据库知识集锦</title>
		<link>https://blog.gmem.cc/oracle-faq</link>
		<comments>https://blog.gmem.cc/oracle-faq#comments</comments>
		<pubDate>Fri, 16 Mar 2007 03:13:48 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1852</guid>
		<description><![CDATA[<p>基本概念 专用&#124;共享服务器模式：区别：专用模式下，一个用户连接进程对应一个服务器的进程 会话与连接的关系： 一个物理TCP/IP连接上可以有多个会话； 会话可以失去物理连接（可以重新关联到物理连接？）； JDBC中的connection，对应了Oracle的会话，而非物理连接。默认情况下，断开连接后，会话的状态可能处理INACTIVE，此时还是占用资源，可以通过设置会话超时，避免长期的资源占用：SQLNET.EXPIRE_TIME=10（分钟） Oracle SQL 关于ROWNUM 1先根据WHERE子句进行过滤 标注结果集的ROWNUM 进行排序（注意，MAX等聚合函数需要排序） Oracle与JDBC 允许DBA登录JDBC [crayon-69d195e310f62930417719/] JDBC提交模式  自动提交  每一个语句被放在单独的事务中执行  手动提交  所有语句放在整个事务中执行，直到commit/rollback被调用 提交发生在语句执行完后，以下几个时间点标志着语句的完成： 对于DML语句（即 <a class="read-more" href="https://blog.gmem.cc/oracle-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/oracle-faq">Oracle数据库知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h2"><span class="graybg">基本概念</span></div>
<ol>
<li>专用|共享服务器模式：区别：专用模式下，一个用户连接进程对应一个服务器的进程</li>
<li>会话与连接的关系：<br />
一个物理TCP/IP连接上可以有多个会话；<br />
会话可以失去物理连接（可以重新关联到物理连接？）；<br />
JDBC中的connection，对应了Oracle的会话，而非物理连接。默认情况下，断开连接后，会话的状态可能处理INACTIVE，此时还是占用资源，可以通过设置会话超时，避免长期的资源占用：SQLNET.EXPIRE_TIME=10（分钟）</li>
</ol>
<div class="blog_h2"><span class="graybg">Oracle SQL</span></div>
<p><strong>关于ROWNUM</strong></p>
<ol>
<li>1先根据WHERE子句进行过滤</li>
<li>标注结果集的ROWNUM</li>
<li>进行排序（注意，MAX等聚合函数需要排序）</li>
</ol>
<div class="blog_h2"><span class="graybg">Oracle与JDBC</span></div>
<strong>允许DBA登录JDBC </strong><br />
<pre class="crayon-plain-tag">Properties props = new Properties();
props.put( "internal_logon", "sysdba" );</pre><br />
<strong>JDBC提交模式</strong>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td> 自动提交</td>
<td> 每一个语句被放在<strong>单独的事务</strong>中执行</td>
</tr>
<tr>
<td> 手动提交</td>
<td> 所有语句放在整个事务中执行，直到commit/rollback被调用</td>
</tr>
</tbody>
</table>
<p>提交发生在语句执行完后，以下几个时间点标志着语句的完成：</p>
<ol>
<li>对于DML语句（即 insert update delete）,执行完毕语句即完成</li>
<li>对于查询语句，当结果集关闭时完成</li>
<li>返回多个结果的CallableStatement，当关联的结果集关闭，并且update counts和输出参数已经被retrieve的时候完成</li>
</ol>
<div class="blog_h2"><span class="graybg">Oracle Hints提示</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td style="width: 200px;">/*+ALL_ROWS*/</td>
<td>对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化</td>
</tr>
<tr>
<td style="width: 250px;">/*+FIRST_ROWS*/</td>
<td>对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化</td>
</tr>
<tr>
<td>/*+CHOOSE*/</td>
<td>如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法</td>
</tr>
<tr>
<td>/*+RULE*/</td>
<td>对语句块选择基于规则的优化方法</td>
</tr>
<tr>
<td>/*+FULL(TABLE)*/</td>
<td>对表选择全局扫描的方法</td>
</tr>
<tr>
<td>/*+ROWID(TABLE)*/</td>
<td>提示明确表明对指定表根据ROWID进行访问</td>
</tr>
<tr>
<td>/*+CLUSTER(TABLE)*/</td>
<td>明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效</td>
</tr>
<tr>
<td>/*+INDEX(TABLE INDEX_NAME)*/</td>
<td>表明对表选择索引的扫描方法</td>
</tr>
<tr>
<td>/*+INDEX_ASC(TABLE INDEX_NAME)*/</td>
<td>表明对表选择索引升序的扫描方法</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">Oracle 锁机制</span></div>
<div class="blog_h3"><span class="graybg">事务隔离级别</span></div>
<p>Oracle 支持三种事务隔离级别：已提交读取，串行化，以及 SQL92 中没有包含的只读模式。Oracle通过多版本一致性模型（multiversion consistency model）来保证可重复读：</p>
<ol>
<li>语句级的读一致性：自动实现，所有结果集数据来自同一时间点</li>
<li>事务级读一致性：确保单个事务中的数据来自同一时间点</li>
</ol>
<div class="blog_h3"><span class="graybg">Oracle锁</span></div>
<p><strong>基本的锁分类：</strong><br />
共享锁（Share Locks，即S锁）：其他事务只能加S锁，不能加X锁<br />
排他锁（Exclusive Locks，即X锁）：其他事务不能对目标数据再加任何类型的锁<br />
<strong>Oracle多粒度锁：</strong><br />
根据保护对象的不同，Oracle数据库锁可以分为以下几大类：</p>
<ol>
<li>DML lock（data locks，数据锁）：用于保护数据的完整性</li>
<li>DDL lock（dictionary locks，字典锁）：用于保护数据库对象的结构（例如表、视图、索引的结构定义）</li>
<li>Internal locks 和latches（内部锁与闩）：保护内部数据库结构</li>
<li>Distributed locks（分布式锁）：用于OPS（并行服务器）中</li>
<li>PCM locks（并行高速缓存管理锁）：用于OPS（并行服务器）中</li>
</ol>
<p><strong> TX锁（事务锁，行级锁）</strong><br />
Oracle行级锁只有X锁，没有S锁<br />
当执行DML语句或者select from update的时候，自动获取TX锁，直到提交或者回滚<br />
每一行上都有关于锁的标记位。对行加锁的时候，必须首先对所在表进行意向锁定<br />
<strong>意向锁</strong><br />
表由行组成，对表加锁时，不但要检查与已经存在的表锁的相容性，还要检查与表里面全部数据的锁的相容性<br />
如果逐条检查数据的锁，很耗时，这就引出意向锁——对行进行加锁时，同时要对其所在的表加意向锁<br />
意向共享锁（Intent Share Lock ,IS锁）：如果要对行加S锁，首先需要对表加IS锁<br />
意向排他锁（IX）：如果要对行加X锁，首先需要对表加IX锁<br />
<strong>读操作默认不加锁</strong><br />
默认的Oracle读数据不加任何锁定，通过回滚段（Rollback segment）来防止脏读</p>
<div class="blog_h2"><span class="graybg">Oracle Job机制</span></div>
<strong>设置并发Job数： </strong><br />
<pre class="crayon-plain-tag">--  0 &lt; n &lt;= 1000
alter system set job_queue_processes=n;</pre><br />
<strong>Jobs字典： </strong><br />
<pre class="crayon-plain-tag">SELECT * FROM USER_JOBS
SELECT * FROM DBA_JOBS
SELECT * FROM ALL_JOBS
SELECT * FROM DBA_JOBS_RUNNING</pre><br />
<strong>管理Jobs：dbms_job包</strong><br />
该包包含以下过程：
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td>Broken</td>
<td>更改已提交的Job的状态，Broken状态的Job不会被尝试执行Oracle多次尝试均不能成功运行的Job，会置为Broken=true</td>
</tr>
<tr>
<td>Change</td>
<td> 改变Job的设置</td>
</tr>
<tr>
<td>Interval</td>
<td>显式设置运行间隔</td>
</tr>
<tr>
<td>Isubmit</td>
<td>使用指定的Job号来提交Job</td>
</tr>
<tr>
<td>Next_Date</td>
<td>显式设定工作时间</td>
</tr>
<tr>
<td>Remove</td>
<td>移除一个Job</td>
</tr>
<tr>
<td>Run</td>
<td>立即运行一个Job</td>
</tr>
<tr>
<td>Submit</td>
<td>提交Job</td>
</tr>
<tr>
<td>What</td>
<td>设置Job的内容</td>
</tr>
</tbody>
</table>
<p><strong>INTERVAL设置</strong><br />
INTERVAL：从<strong>Job运行结束的那一刻</strong>，判断下一次执行的时间<br />
注意：Oracle日期函数中，1代表一天</p>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td>Interval =&gt; TRUNC(sysdate,'mi') + 1/ (24*60)Interval =&gt; sysdate+1/1440</td>
<td>每分钟执行</td>
</tr>
<tr>
<td>Interval =&gt; TRUNC(sysdate) + 1 +1/ (24)</td>
<td>每天的凌晨1点执行</td>
</tr>
<tr>
<td>Interval =&gt; TRUNC(NEXT_DAY(sysdate,2))+1/24</td>
<td>每周一凌晨1点执行（NEXT_DAY返回下一个星期X。数字1-7，分别表示周日到周六 ）</td>
</tr>
<tr>
<td>Interval =&gt;TRUNC(LAST_DAY(SYSDATE))+1+1/24</td>
<td>每月1日凌晨1点执行（LAST_DAY返回某月份的最后一天）</td>
</tr>
<tr>
<td>Interval =&gt; TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24</td>
<td>每季度的第一天凌晨1点执行</td>
</tr>
<tr>
<td>Interval =&gt; ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24</td>
<td>每年7月1日和1月1日凌晨1点</td>
</tr>
<tr>
<td>Interval =&gt;ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24</td>
<td>每年1月1日凌晨1点执行</td>
</tr>
</tbody>
</table>
提交Job的代码示例：<br />
<pre class="crayon-plain-tag">DECLARE
  V_I  INTEGER;
BEGIN
  FOR IDX IN (SELECT JOB FROM USER_JOBS WHERE WHAT = 'PKG_SUP_INFO_AJ.USP_SUP_AJ_JOB;') LOOP
    DBMS_JOB.REMOVE(IDX.JOB);
  END LOOP;
  SYS.DBMS_JOB.SUBMIT(JOB =&gt; V_I,
                      WHAT =&gt; 'PKG_SUP_INFO_AJ.USP_SUP_AJ_JOB;',
                      NEXT_DATE =&gt; TO_DATE('08-01-2011 02:00:00', 'DD-MM-YYYY HH24:MI:SS'),
                      INTERVAL =&gt; 'TRUNC(SYSDATE) +1 + 2/24');
  COMMIT;
END;</pre>
<div class="blog_h2"><span class="graybg">数据字典</span></div>
<p>Oracle数据字典中，对象名称多以USER. ALL. DBA.为前缀：</p>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td>USER.</td>
<td>视图中记录通常记录执行查询的帐户所拥有的对象的信息</td>
</tr>
<tr>
<td>ALL.</td>
<td>视图中记录包括"USER"记录和授权至PUBLIC或用户的对象的信息</td>
</tr>
<tr>
<td>DBA.</td>
<td>视图包含所有数据库对象</td>
</tr>
</tbody>
</table>
<p>常用的数据字典如下：</p>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td>ALL_CATALOG</td>
<td>所有用户可见的表、视图、同义词、序列等</td>
</tr>
<tr>
<td>ALL_COL_COMMENTS</td>
<td>所有可见表、视图的列注释</td>
</tr>
<tr>
<td>ALL_COL_GRANTS_MADE</td>
<td>所有者或者授权者的列授权信息</td>
</tr>
<tr>
<td style="width: 250px;">ALL_COL_GRANTS_RECD</td>
<td>用户或者PUBLIC是授权目标的列授权信息</td>
</tr>
<tr>
<td>ALL_COL_PRIVS</td>
<td>Grants on columns for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee</td>
</tr>
<tr>
<td>ALL_COL_PRIVS_MADE</td>
<td>Grants on columns for which the user is owner or grantor</td>
</tr>
<tr>
<td>ALL_COL_PRIVS_RECD</td>
<td>Grants on columns for which the user, PUBLIC or enabled role is the grantee</td>
</tr>
<tr>
<td>ALL_CONSTRAINTS</td>
<td>表上的约束定义</td>
</tr>
<tr>
<td>ALL_CONS_COLUMNS</td>
<td>列上的约束定义</td>
</tr>
<tr>
<td>ALL_DB_LINKS</td>
<td>DB Link定义</td>
</tr>
<tr>
<td>ALL_DEF_AUDIT_OPTS</td>
<td>Auditing options for newly created objects</td>
</tr>
<tr>
<td>ALL_DEPENDENCIES</td>
<td>依赖关系（从/到）</td>
</tr>
<tr>
<td>ALL_ERRORS</td>
<td>存储对象上的错误</td>
</tr>
<tr>
<td>ALL_INDEXES</td>
<td>表上的索引描述</td>
</tr>
<tr>
<td>ALL_IND_COLUMNS</td>
<td>列上的索引描述</td>
</tr>
<tr>
<td>ALL_OBJECTS</td>
<td>全部对象</td>
</tr>
<tr>
<td>ALL_REFRESH</td>
<td>All the refresh groups that the user can touch</td>
</tr>
<tr>
<td>ALL_REFRESH_CHILDREN</td>
<td>All the objects in refresh groups, where the user can touch the group</td>
</tr>
<tr>
<td>ALL_SEQUENCES</td>
<td>全部序列</td>
</tr>
<tr>
<td>ALL_SNAPSHOTS</td>
<td>Snapshots the user can look at</td>
</tr>
<tr>
<td>ALL_SOURCE</td>
<td>Current source on stored objects that user is allowed to create</td>
</tr>
<tr>
<td>ALL_SYNONYMS</td>
<td>所有用户可见的同义词</td>
</tr>
<tr>
<td>ALL_TABLES</td>
<td>所有表</td>
</tr>
<tr>
<td>ALL_TAB_COLUMNS</td>
<td>所有表、视图、cluster的列</td>
</tr>
<tr>
<td>ALL_TAB_COMMENTS</td>
<td>所有表、视图的注释</td>
</tr>
<tr>
<td>ALL_TAB_GRANTS_MADE</td>
<td>User's grants and grants on user's objects</td>
</tr>
<tr>
<td>ALL_TAB_GRANTS_RECD</td>
<td>Grants on objects for which the user or PUBLIC is the grantee</td>
</tr>
<tr>
<td>ALL_TAB_PRIVS</td>
<td>Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee</td>
</tr>
<tr>
<td>ALL_TAB_PRIVS_MADE</td>
<td>User's grants and grants on user's objects</td>
</tr>
<tr>
<td>ALL_TAB_PRIVS_RECD</td>
<td>Grants on objects for which the user, PUBLIC or enabled role is the grantee</td>
</tr>
<tr>
<td>ALL_TRIGGERS</td>
<td>所有触发器</td>
</tr>
<tr>
<td>ALL_TRIGGER_COLS</td>
<td>触发器用到的列、或者被列用到的触发器</td>
</tr>
<tr>
<td>ALL_USERS</td>
<td>用户信息</td>
</tr>
<tr>
<td>ALL_VIEWS</td>
<td>视图信息</td>
</tr>
<tr>
<td>USER_AUDIT_CONNECT</td>
<td>用户登陆/退出的审计记录</td>
</tr>
<tr>
<td>USER_AUDIT_OBJECT</td>
<td>Audit trail records for statements concerning objects, specifically: table, cluster, view, index, sequence, [public] database link, [public] synonym, procedure, trigger,rollback segment, tablespace, role, user</td>
</tr>
<tr>
<td>USER_AUDIT_SESSION</td>
<td></td>
</tr>
<tr>
<td>USER_AUDIT_STATEMENT</td>
<td>Audit trail records concerning grant, revoke, audit, noaudit and alter system</td>
</tr>
<tr>
<td>USER_AUDIT_TRAIL</td>
<td>Audit trail entries relevant to the user</td>
</tr>
<tr>
<td>USER_CATALOG</td>
<td></td>
</tr>
<tr>
<td>USER_CLUSTERS</td>
<td></td>
</tr>
<tr>
<td>USER_CLU_COLUMNS</td>
<td>表列到cluster列的映射</td>
</tr>
<tr>
<td>USER_JOBS</td>
<td>任务定义</td>
</tr>
<tr>
<td>USER_OBJECT_SIZE</td>
<td>多种PL/SQL对象的长度（bytes）</td>
</tr>
<tr>
<td>USER_OBJ_AUDIT_OPTS</td>
<td>用户表、视图的审计选项</td>
</tr>
<tr>
<td>USER_RESOURCE_LIMITS</td>
<td>用户的资源使用限制</td>
</tr>
<tr>
<td>USER_ROLE_PRIVS</td>
<td>当前用户的角色与特权</td>
</tr>
<tr>
<td>USER_SEGMENTS</td>
<td>分配给所有数据库段的存储</td>
</tr>
<tr>
<td>USER_SYS_PRIVS</td>
<td>授予当前用户的系统特权</td>
</tr>
<tr>
<td>USER_TABLESPACES</td>
<td>可见表空间</td>
</tr>
<tr>
<td>USER_TS_QUOTAS</td>
<td>表空间配额</td>
</tr>
<tr>
<td>USER_USERS</td>
<td>当前用户信息</td>
</tr>
<tr>
<td>USER_VIEWS</td>
<td>当前用户所有视图</td>
</tr>
<tr>
<td>COLUMN_PRIVILEGES</td>
<td>Grants on columns for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee</td>
</tr>
<tr>
<td>DICTIONARY</td>
<td>数据字典本身的描述</td>
</tr>
<tr>
<td>DICT_COLUMNS</td>
<td>数据字典列的描述</td>
</tr>
<tr>
<td>DUAL</td>
<td>虚表</td>
</tr>
<tr>
<td>GLOBAL_NAME</td>
<td>数据库全局名称</td>
</tr>
<tr>
<td>INDEX_HISTOGRAM</td>
<td>statistics on keys with repeat count</td>
</tr>
<tr>
<td>INDEX_STATS</td>
<td>statistics on the b-tree</td>
</tr>
<tr>
<td>RESOURCE_COST</td>
<td>Cost for each resource</td>
</tr>
<tr>
<td>ROLE_ROLE_PRIVS</td>
<td>Roles which are granted to roles</td>
</tr>
<tr>
<td>ROLE_SYS_PRIVS</td>
<td>System privileges granted to roles</td>
</tr>
<tr>
<td>ROLE_TAB_PRIVS</td>
<td>Table privileges granted to roles</td>
</tr>
<tr>
<td>SESSION_PRIVS</td>
<td>Privileges which the user currently has set</td>
</tr>
<tr>
<td>SESSION_ROLES</td>
<td>Roles which the user currently has enabled</td>
</tr>
<tr>
<td>TABLE_PRIVILEGES</td>
<td>Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">用户管理</span></div>
创建用户脚本示例<br />
<pre class="crayon-plain-tag">-- Create the user
create user NU
  identified by NU
  default tablespace TS
  temporary tablespace TST
  profile DEFAULT;
-- Grant/Revoke role privileges
grant connect to NU;
-- Grant/Revoke system privileges
grant alter session to NU;
grant create any snapshot to NU;
grant create any trigger to NU;
grant create procedure to NU;
grant create sequence to NU;
grant create session to NU;
grant create table to NU;
grant create type to NU;
grant create view to NU;
grant select any dictionary to NU;
grant unlimited tablespace to NU with admin option;</pre><br />
删除用户：drop user 用户名 cascade; cascade //将用户连同其创建的东西全部删除
<div class="blog_h2"><span class="graybg">权限管理</span></div>
<div class="blog_h3"><span class="graybg">系统权限：系统规定用户使用数据库的权限</span></div>
<p><strong>系统权限分类</strong></p>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="text-align: center;">权限分类</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>DBA</td>
<td>拥有全部特权，是系统最高权限，只有DBA才可以创建数据库结构</td>
</tr>
<tr>
<td>RESOURCE</td>
<td>拥有Resource权限的用户只可以创建实体，不可以创建数据库结构</td>
</tr>
<tr>
<td>CONNECT</td>
<td>拥有Connect权限的用户只可以登录Oracle，不可以创建实体，不可以创建数据库结构</td>
</tr>
</tbody>
</table>
对于普通用户：授予connect, resource权限；对于DBA管理用户：授予connect，resource, dba权限<br />
系统权限只能由DBA用户授出,普通用户通过授权可以具有与system相同的用户权限，但永远不能达到与sys用户相同的权限，system用户的权限也可以被回收<br />
<strong>系统权限授权命令</strong><br />
<pre class="crayon-plain-tag">--授予权限
grant connect, resource, dba to user1 [,user2]...;
--授予可传递权限（被授予用户可以授予其他用户）
grant connect, resorce to user0 with admin option; 
--查询权限
select * from dba_role_privs;
select * from dba_sys_privs;
select * from role_sys_privs;
--回收权限，只能由DBA执行，系统权限不会级联回收
Revoke connect, resource from user0;</pre>
<div class="blog_h3"><span class="graybg">实体权限：某用户对其它用户的表或视图的存取权限</span></div>
实体权限分类：select, update, insert, alter, index, delete, all , execute<br />
<strong>实体权限授权命令</strong><br />
<pre class="crayon-plain-tag">-- 把product的增改查权限授予user0
grant select, update, insert on product to user0;
-- 把product的所有权限授予user0
grant all on product to user0;
-- 把product的所有权限授予所有用户
grant all on product to public;
-- 实体权限传递：with grant option，可以授予其他人
grant select, update on product to user02 with grant option; 
-- 实体权限回收，传递的权限全部收回
Revoke select, update on product from user02; 
-- 实体权限数据字典
select owner, table_name from all_tables; 
select table_name from user_tables;  
select grantor, table_schema, table_name, privilege from all_tab_privs; 
select grantee, owner, table_name, privilege from user_tab_privs;</pre>
<div class="blog_h2"><span class="graybg">常用脚本</span></div>
<div class="blog_h3"><span class="graybg">管理表空间</span></div>
<pre class="crayon-plain-tag">--创建表空间
CREATE TABLESPACE "TS"
    LOGGING
    DATAFILE 'D:\ORACLE\ORADATA\CPDB\TS.ora' SIZE 100M
    AUTOEXTEND
    ON NEXT  100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
    SEGMENT SPACE MANAGEMENT  AUTO 
--创建临时表空间
CREATE
    TEMPORARY TABLESPACE "NETBAISTEMP" TEMPFILE
    'D:\ORACLE\ORADATA\CPDB\NETBAISTEMP.ora' SIZE 100M AUTOEXTEND
    ON NEXT  100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
    UNIFORM SIZE 1M</pre>
<div class="blog_h3"><span class="graybg">导入/导出表/库</span></div>
导入时提示只有dba才能导入其他dba导出的dmp：使用system用户<br />
<pre class="crayon-plain-tag">-- 导出一张表
exp user/passwd@dbname file=dmppath tables=(tab_name)  query="where 1=1"
-- 导出整个库     
exp user/passwd@dbname BUFFER=1000 file=dmppath owner=user log=logpath
-- 导入DMP文件
imp user/passwd@dbname file=dmppath fromuser=user touser=user ignore=y</pre>
<div class="blog_h3"><span class="graybg">锁定对象查询</span></div>
<pre class="crayon-plain-tag">--查具有锁定的用户
SELECT USERNAME, LOCKWAIT, STATUS, MACHINE, PROGRAM
  FROM V$SESSION
  WHERE SID IN ( SELECT SESSION_ID FROM V$LOCKED_OBJECT)
 
--查锁定的SQL
  SELECT SQL_TEXT
    FROM V$SQL
   WHERE HASH_VALUE IN
         ( SELECT SQL_HASH_VALUE
            FROM V$SESSION
           WHERE SID IN ( SELECT SESSION_ID FROM V$LOCKED_OBJECT))
--查锁定的SID等
SELECT S.USERNAME,
       S.STATUS,
       L.OBJECT_ID,
       P.SPID,
       L.SESSION_ID,
       S.SERIAL#,
       L.ORACLE_USERNAME,
       L.OS_USER_NAME,
       L.PROCESS
  FROM V$LOCKED_OBJECT L, V$SESSION S, V$PROCESS P
 WHERE L.SESSION_ID = S.SID
   AND S.PADDR = P.ADDR
--杀死锁定会话
ALTER SYSTEM KILL SESSION 'sid,serial' ;</pre>
<div class="blog_h3"><span class="graybg">查询会话的信息</span></div>
<pre class="crayon-plain-tag">SELECT A.SID || ',' || A.SERIAL# AS "SID,SERIAL",
       A.USERNAME,
       A.TERMINAL,
       A.PROGRAM,
       S.SQL_TEXT
  FROM V$SESSION A, V$SQLAREA S
WHERE A.SQL_ADDRESS = S.ADDRESS(+)
   AND A.SQL_HASH_VALUE = S.HASH_VALUE(+)
ORDER BY A.USERNAME, A.SID</pre>
<div class="blog_h3"><span class="graybg">修改系统日期时间格式</span></div>
<pre class="crayon-plain-tag">alter system set nls_date_format = 'YYYY-MM-DD hh24:mi:ss' scope=spfile;</pre>
<div class="blog_h3"><span class="graybg">查执行缓慢的SQL语句</span></div>
<pre class="crayon-plain-tag">SELECT OSUSER,
       PROGRAM,
       USERNAME,
       SCHEMANAME,
       B.CPU_TIME,
       STATUS,
       B.SQL_TEXT
  FROM V$SESSION A
  LEFT JOIN V$SQL B
    ON A.SQL_ADDRESS = B.ADDRESS
   AND A.SQL_HASH_VALUE = B.HASH_VALUE
ORDER BY B.CPU_TIME DESC</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/oracle-faq">Oracle数据库知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/oracle-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
