oracle中print_table存储过程实例介绍

定义

所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

一直以来,觉得MySQL中使用\G参数改变输出结果集的显示方式非常好用,尤其是在命令行界面。但是ORACLE数据库没有这个功能,今天在搜索到Tom大师的一篇博文时,发现大师用一个存储过程print_table实现了类似这样的功能。只是我们这些凡夫俗子不知道而已,特意整理在此,方便自己或有需要的人以后查看。

CREATE OR REPLACE PROCEDURE print_table(p_query IN VARCHAR2)
AUTHID CURRENT_USER
IS
 l_thecursor INTEGER DEFAULT dbms_sql.open_cursor;
 l_columnvalue VARCHAR2(4000);
 l_status  INTEGER;
 l_desctbl  dbms_sql.desc_tab;
 l_colcnt  NUMBER;
BEGIN
 EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss'' '; 

 dbms_sql.parse(l_thecursor, p_query, dbms_sql.native); 

 dbms_sql.describe_columns (l_thecursor, l_colcnt, l_desctbl); 

 FOR i IN 1 .. l_colcnt LOOP
  dbms_sql.define_column (l_thecursor, i, l_columnvalue, 4000);
 END LOOP; 

 l_status := dbms_sql.EXECUTE(l_thecursor); 

 WHILE ( dbms_sql.Fetch_rows(l_thecursor) > 0 ) LOOP
  FOR i IN 1 .. l_colcnt LOOP
   dbms_sql.column_value (l_thecursor, i, l_columnvalue); 

   dbms_output.Put_line (RPAD(L_desctbl(i).col_name, 30)
         || ': '
         || l_columnvalue);
  END LOOP; 

  dbms_output.put_line('-----------------');
 END LOOP; 

 EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-rr'' ';
EXCEPTION
 WHEN OTHERS THEN
    EXECUTE IMMEDIATE
    'alter session set nls_date_format=''dd-MON-rr'' '; 

    RAISE;
END;
/

如下测试所示:

SQL> set serveroutput on size 99999;
SQL> execute print_table('select * from v$session where sid=997');
SADDR       : 000000085FA35CA0
SID       : 997
SERIAL#      : 1
AUDSID      : 0
PADDR       : 000000085F6B7E70
USER#       : 0
USERNAME      :
COMMAND      : 0
OWNERID      : 2147483644
TADDR       :
LOCKWAIT      :
STATUS      : ACTIVE
SERVER      : DEDICATED
SCHEMA#      : 0
SCHEMANAME     : SYS
OSUSER      : oracle
PROCESS      : 5036
MACHINE      : xxxx
PORT       : 0
TERMINAL      : UNKNOWN
PROGRAM      : oracle@xxxxx (DBW0)
TYPE       : BACKGROUND
SQL_ADDRESS     : 00
SQL_HASH_VALUE    : 0
SQL_ID      :
SQL_CHILD_NUMBER    : 0
PREV_SQL_ADDR     : 00
PREV_HASH_VALUE    : 0
PREV_SQL_ID     :
PREV_CHILD_NUMBER    : 0
PLSQL_ENTRY_OBJECT_ID   :
PLSQL_ENTRY_SUBPROGRAM_ID  :
PLSQL_OBJECT_ID    :
PLSQL_SUBPROGRAM_ID   :
MODULE      :
MODULE_HASH     : 0
ACTION      :
ACTION_HASH     : 0
CLIENT_INFO     :
FIXED_TABLE_SEQUENCE   : 0
ROW_WAIT_OBJ#     : -1
ROW_WAIT_FILE#    : 0
ROW_WAIT_BLOCK#    : 0
ROW_WAIT_ROW#     : 0
LOGON_TIME     : 04-jul-2018 21:15:52
LAST_CALL_ET     : 5272838
PDML_ENABLED     : NO
FAILOVER_TYPE     : NONE
FAILOVER_METHOD    : NONE
FAILED_OVER     : NO
RESOURCE_CONSUMER_GROUP  :
PDML_STATUS     : DISABLED
PDDL_STATUS     : DISABLED
PQ_STATUS      : DISABLED
CURRENT_QUEUE_DURATION  : 0
CLIENT_IDENTIFIER    :
BLOCKING_SESSION_STATUS  : NO HOLDER
BLOCKING_INSTANCE    :
BLOCKING_SESSION    :
SEQ#       : 34697
EVENT#      : 3
EVENT       : rdbms ipc message
P1TEXT      : timeout
P1       : 300
P1RAW       : 000000000000012C
P2TEXT      :
P2       : 0
P2RAW       : 00
P3TEXT      :
P3       : 0
P3RAW       : 00
WAIT_CLASS_ID     : 2723168908
WAIT_CLASS#     : 6
WAIT_CLASS     : Idle
WAIT_TIME      : 0
SECONDS_IN_WAIT    : 107
STATE       : WAITING
SERVICE_NAME     : SYS$BACKGROUND
SQL_TRACE      : DISABLED
SQL_TRACE_WAITS    : FALSE
SQL_TRACE_BINDS    : FALSE
ECID       :
-----------------
PL/SQL procedure successfully completed.
SQL>

参考资料:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:1035431863958,%7Bprint_table%7D

总结

以上所述是小编给大家介绍的oracle中print_table存储过程介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法.分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL. 首先,在数据库端创建简单的存储过程. create or replace procedure test_msg(i_user in varchar2, o_msg out varchar2) is begin o_msg := i_user ||', Good Morning!'; end; 然后,开始在Pytho

  • 详解Oracle调试存储过程

    详解Oracle调试存储过程 一 调试关键步骤 1.在要调试的存储过程右键,选择编辑以进行调试,截图如下: 2.点击小瓢虫,弹出调试窗口,截图如下: 3.输入7839员工编号,点击确认,进行调试,截图如下: 4.该截图说明权限不够,需要添加scott用户的权限. 5.增加权限语句如下: SQL> show user USER 为"SCOTT" SQL> connect system 输入口令: 已连接. SQL> show user USER 为"SYSTE

  • Oracle存储过程和存储函数创建方法(详解)

    select * from emp; -----------------存储过程------------------------ --定义 create[or replace] procedure 存储过程名称(参数名 [in]/out 数据类型)    is/as    begin --逻辑表达式  end [存储过程名称]; --定义存储过程计算年薪,并答应输出 create or replace procedure proc_salyears(v_no in number)    is  

  • Oracle中instr和substr存储过程详解

    instr和substr存储过程,分析内部大对象的内容 instr函数 instr函数用于从指定的位置开始,从大型对象中查找第N个与模式匹配的字符串. 用于查找内部大对象中的字符串的instr函数语法如下: dbms_lob.instr( lob_loc in blob, pattern in raw, offset in integer := 1; nth in integer := 1) return integer; dbms_lob.instr( lob_loc in clob char

  • oracle中 procedure(存储过程)和function(函数)本质区别

    Oracle function里面是可以允许有DML语句的,但是不能在查询的时候使用. 我们常用的function如: select max(a) from table ; 这种调用方式是不能执行带有DML的FUNCTION的. 但是如果不用在SQL里面是可以有的 比如 dbms_output.put_line(func(...));   如果函数里面采用自治事务,是可以有DML 的. 什么是"自治事务": 自治事务是可以在其他事务中调用的独立事务. 自治事务可以使事务离开调用事务的上

  • Oracle存储过程及调用

    Oracle存储过程语法 Oracle的存储过程语法如下: create procedure 存储过程名称(随便取) is 在这里可以定义常量.变量.游标.复杂数据类型这里可以定义变量.常量 begin 执行部分 end; (2)带参数的存储过程语法: create procedure 存储过程名称(随便取) (变量1 数据类型,变量2 数据类型,...,变量n 数据类型) is 在这里可以定义常量.变量.游标.复杂数据类型这里可以定义变量.常量 begin 执行部分 end; (3)带输入.输

  • oracle中print_table存储过程实例介绍

    定义 所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过 编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数 来调用并执行它,从而完成一个或一系列的数据库操作. 一直以来,觉得MySQL中使用\G参数改变输出结果集的显示方式非常好用,尤其是在命令行界面.但是ORACLE数据库没有这个功能,今天在搜索到Tom大师的一篇博文时,发现大师用一个存储过程print_table实现了类似这样的功能

  • Android中Activity组件实例介绍

    目录 Activity 概述 启动 Activity 的两种情况 关闭 Activity 总结 Activity 概述 在 Android 应用中,提供了 4 大基本组件,分别是 Activity.Service.BroadcastReceiver 和 ContentProvider.而 Activity 是 Android 应用最常见的组件之一.Activity 的中文意思是活动.在 Android 中,Activity 代表手机或者平板电脑中的一屏,它提供了和用户交互的可视化界面.在一个 A

  • Oracle中的定时任务实例教程

    目录 一.Oracle 中的定时任务的实例 1.1.创建一个测试表,只有一个 DATE 类型字段 1.2.创建一个自定义存储过程 1.3.创建定时任务JOB 1.4.运行JOB (1.3执行成功后,job就已经开始执行了) 1.5.关于JOB的查询操作 1.6.常见的Interval 设置 1.7.编写存储过程的格式样例 补充:Oracle手动执行定时任务 总结 一.Oracle 中的定时任务的实例 1.1.创建一个测试表,只有一个 DATE 类型字段 CREATE TABLE TEST_A(T

  • jsp中使用javabean实例介绍

    test.jsp中的代码如下所示 复制代码 代码如下: <%@ page language = "java" import="test.SimpleBean;" %> <html><head><title>JSP中使用 Java Bean的测试</title></head><body><jsp:useBean id="test" class="te

  • Oracle中转义字符的详细介绍

    最近工作中遇到一个需求,需要更新Oracle数据库中所有表的一个字段"flag"为"I",语句为: update table_name set flag = 'I' "I"作为字符串,所以语句中I需要加上单引号. 由于数据库中有多张表,我不想一条一条的语句写,希望能够通过sql语句直接生成所有的语句,所以写了如下sql: select 'update ' || table_name || ' set flag = 'I'' || ';' from

  • Oracle 中XML处理函数介绍

    1. EXTRACT(XMLType_instance,Xpath_string) 该函数用于返回XML节点路径下的相应内容 示例: 复制代码 代码如下: SELECT extract(value(a),'/root/main') data FROM xmltable a ; 2. EXTRACTVALUE(XMLType_instance,Xpath_string) 该函数用于返回特定XML节点路径的数据 示例: 复制代码 代码如下: SELECT extractvalue(value(a),

  • jquery中 $.expr使用实例介绍

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> new docum

  • Oracle SQL注入的实例总结

    目录 0x00 Oracle基础 Oracle 基本使用 什么是Oracle数据库? Oracle数据库的特点 相比于其他数据库 Oracle的优缺点 登录Oracle数据库 Oracle数据库基本表管理语句 Oracle权限控制 Oracle权限概述 权限分类 系统权限(用户权限管理) 系统权限授权命令 实体权限(表权限管理) 引入知识 0x01 常见注入类型 union联合查询注入 Oracle union联合查询注入基本流程 error 注入 常用显错函数 其他常用显错函数 Oracle

  • oracle中存储函数与存储过程的区别介绍

    在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,可是也有它们的不同之处,这段时间刚学完函数与存储过程,来给自己做一个总结: 一:存储过程:简单来说就是有名字的pl/sql块. 语法结构: create or replace 存储过程名(参数列表) is --定义变量 begin --pl/sql end; 案例: create or replace procedure add_(a int,b int) is c int; begin c:=a+b; dbms_ou

随机推荐