45个非常有用的Oracle查询语句(四)
询每个执行读取的前十个 SQL
?
SELECT *
? FROM ( ?SELECT ROWNUM,
? ? ? ? ? ? ? ? ?SUBSTR (a.sql_text, 1, 200) sql_text,
? ? ? ? ? ? ? ? ?TRUNC (
? ? ? ? ? ? ? ? ? ? a.disk_reads / DECODE (a.executions, 0, 1, a.executions))
? ? ? ? ? ? ? ? ? ? reads_per_execution,
? ? ? ? ? ? ? ? ?a.buffer_gets,
? ? ? ? ? ? ? ? ?a.disk_reads,
? ? ? ? ? ? ? ? ?a.executions,
? ? ? ? ? ? ? ? ?a.sorts,
? ? ? ? ? ? ? ? ?a.address
? ? ? ? ? ? FROM v$sqlarea a
? ? ? ? ORDER BY 3 DESC)
?WHERE ROWNUM < 10;
在视图中查询并显示实际的 Oracle 连接
?
SELECT osuser,
? ? ? ? ?username,
? ? ? ? ?machine,
? ? ? ? ?program
? ? FROM v$session
ORDER BY osuser;
查询并显示通过打开连接程序打开连接的组
?
SELECT program application, COUNT (program) Numero_Sesiones
? ? FROM v$session
GROUP BY program
ORDER BY Numero_Sesiones DESC;
查询并显示连接 Oracle 的用户和用户的会话数量
?
SELECT username Usuario_Oracle, COUNT (username) Numero_Sesiones
? ? FROM v$session
GROUP BY username
ORDER BY Numero_Sesiones DESC;
获取拥有者的对象数量
?
SELECT owner, COUNT (owner) number_of_objects
? ? FROM dba_objects
GROUP BY owner
ORDER BY number_of_objects DESC;
实用/数学 相关的查询
?
把数值转换成文字
更多信息可以查看: Converting number into words in Oracle
?
SELECT TO_CHAR (TO_DATE (1526, 'j'), '
jsp') FROM DUAL;
输出:
?
one thousand five hundred twenty-six
在包的源代码中查询字符串
这个查询语句会在所有包的源代码上搜索‘FOO_SOMETHING’ ,可以帮助用户在源代码中查找特定的存储过程或者是函数调用。
?
--search a string foo_something in package source code
SELECT *
? FROM dba_source
?WHERE UPPER (text) LIKE '%FOO_SOMETHING%'?
AND owner = 'USER_NAME';
把用逗号分隔的数据插入的表中
当 你想把用逗号分隔开的字符串插入表中的时候,你可以使用其他的查询语句,比如 IN 或者是 NOT IN 。这里我们把‘AA,BB,CC,DD,EE,FF’转换成包含 AA,BB,CC 等作为一行的表,这样你就很容易把这些字符串插入到其他表中,并快速的做一些相关的操作。
?
WITH csv
? ? ?AS (SELECT 'AA,BB,CC,DD,EE,FF'
? ? ? ? ? ? ? ? ? ?AS csvdata
? ? ? ? ? ?FROM DUAL)
? ? SELECT REGEXP_SUBSTR (csv.csvdata, '[^,]+', 1, LEVEL) pivot_char
? ? ? FROM DUAL, csv
CONNECT BY REGEXP_SUBSTR (csv.csvdata,'[^,]+', 1, LEVEL) IS NOT NULL;
查询表中的最后一个记录
这个查询语句很直接,表中没有主键,或者是用户不确定记录最大主键是否是最新的那个记录时,就可以使用这个语句来查询表中最后一个记录。
?
SELECT *
? FROM employees
?WHERE ROWID IN (SELECT MAX (ROWID) FROM employees);
?
(OR)
?
SELECT * FROM employees
MINUS
SELECT *
? FROM employees
?WHERE ROWNUM < (SELECT COUNT (*) FROM employees);
在
Oracle 中做行数据乘法
这个查询语句使用一些复杂的数学函数来做每个行的数值乘法。更多内容请查阅: Row Data Multiplication In Oracle
?
?
WITH tbl
? ? ?AS (SELECT -2 num FROM DUAL
? ? ? ? ?UNION
? ? ? ? ?SELECT -3 num FROM DUAL
? ? ? ? ?UNION
? ? ? ? ?SELECT -4 num FROM DUAL),
? ? ?sign_val
? ? ?AS (SELECT CASE MOD (COUNT (*), 2) WHEN 0 THEN 1 ELSE -1 END val
? ? ? ? ? ?FROM tbl
? ? ? ? ? WHERE num < 0)
? SELECT EXP (SUM (LN (ABS (num)))) * val
? ? FROM tbl, sign_val
GROUP BY val;
在 Oracle 生成随机数据
每个开发者都想能轻松生成一堆随机数据来测试数据库多好,下面这条查询语句就可以满足你,它可以在 Oracle 中生成随机的数据插入到表中。详细信息可以查看 Random Data in Oracle
?
SELECT LEVEL empl_id,
? ? ? ? ? ?MOD (ROWNUM, 50000) dept_id,
? ? ? ? ? ?TRUNC (DBMS_RANDOM.VALUE (1000, 500000), 2) salary,
? ? ? ? ? ?DECODE (ROUND (DBMS_RANDOM.VALUE (1, 2)), ?1, 'M', ?2, 'F') gender,
? ? ? ? ? ?TO_DATE (
? ? ? ? ? ? ? ? ?ROUND (DBMS_RANDOM.VALUE (1, 28))
? ? ? ? ? ? ? || '-'
? ? ? ? ? ? ? || ROUND (DBMS_RANDOM.VALUE (1, 12))
? ? ? ? ? ? ? || '-'
? ? ? ? ? ? ? || ROUND (DBMS_RANDOM.VALUE (1900, 2010)),
? ? ? ? ? ? ? 'DD-MM-YYYY')
? ? ? ? ? ? ? dob,
? ? ? ? ? ?DBMS_RANDOM.STRING ('x', DBMS_RANDOM.VALUE (20, 50)) address
? ? ? FROM DUAL
CONNECT BY LEVEL < 10000;
在 Oracle 中生成随机数值
这是 Oracle 普通的旧的随机数值