精华内容
下载资源
问答
  • 当前位置:我的异常网» Oracle管理»oracle存储过程中临时的使用,该怎么处理oracle存储过程中临时的使用,该怎么处理www.myexceptions.net网友分享于:2013-03-27浏览:420次oracle存储过程中临时的使用我想...

    当前位置:我的异常网» Oracle管理 » oracle存储过程中临时表的使用,该怎么处理

    oracle存储过程中临时表的使用,该怎么处理

    www.myexceptions.net  网友分享于:2013-03-27  浏览:420次

    oracle存储过程中临时表的使用

    我想完成一个存储过程 实现创建临时表 插入数据 查询结果(以游标返回) 删除临时表的操作 代码如下 不知道问题在哪?

    貌似在用循环插入数据时就出错了,这里我是要用循环插入数据的,要通过筛选数据 不能直接

    CREATE GLOBAL TEMPORARY TABLE TEMP_STUDENTINFO ON COMMIT PRESERVE ROWS as select * from table;

    代码如下

    create or replace procedure sys_Operation_Select

    (

    V_CX out SYS_REFCURSOR

    )

    as

    V_SqlString varchar2(2000);

    CURSOR cur_opt IS select * from sys_Operation;

    begin

    V_SqlString:='CREATE GLOBAL TEMPORARY TABLE temp_DomainOperation (

    ID VARCHAR2(36),

    OperationDomain VARCHAR2(36),

    Name varchar2(50),

    Father varchar2(36),

    URL varchar2(200),

    Target varchar2(50),

    ICON varchar2(50),

    Seq integer,

    Memo varchar(50)

    ) ON COMMIT PRESERVE ROWS';

    execute immediate V_SqlString;

    FOR v_opt IN cur_opt LOOP

    V_SqlString:=' insert into temp_DomainOperation values (v_opt.id,v_opt.operationdomain,v_opt.name,v_opt.father,v_opt.url,v_opt.target,v_opt.Icon,v_opt.seq,v_opt.memo)';

    DBMS_OUTPUT.PUT_LINE(V_SqlString);

    execute immediate V_SqlString;

    END LOOP;

    V_SqlString:=' select * from TEMP_DOMAINOPERATION';

    open V_CX for V_SqlString;

    V_SqlString:='drop table temp_DomainOperation';

    execute immediate V_SqlString;

    end sys_Operation_Select;

    ------解决方案--------------------

    1、oracle临时表不要这样使用,oracle临时表不同于其它数据库的临时表,如果sqlserver;oracle临时表的特点时数据临时。

    2、要使用临时表,事先建立好临时表就行了,并由oracle自己去处理并发就行了,并且每个会话的数据是互不影响的。

    3、在万不得已的情况下,尽量不要使用动态SQL,因为其性能比静态SQL低。

    --建立临时表

    CREATE GLOBAL TEMPORARY TABLE temp_DomainOperation(

    ID VARCHAR2(36),

    OperationDomain VARCHAR2(36),

    Name varchar2(50),

    Father varchar2(36),

    URL varchar2(200),

    Target varchar2(50),

    ICON varchar2(50),

    Seq integer,

    Memo varchar(50)

    ) ON COMMIT PRESERVE ROWS;

    --建立存储过程

    CREATE OR REPLACE PROCEDURE sys_Operation_Select(V_CX OUT SYS_REFCURSOR)

    AUTHID CURRENT_USER AS

    V_SqlString VARCHAR2(2000);

    CURSOR cur_opt IS

    SELECT * FROM sys_Operation;

    BEGIN

    FOR v_opt IN cur_opt LOOP

    V_SqlString := 'insert into temp_DomainOperation values (:id,:operationdomain,:name,:father,:url,:target,:Icon,:seq,:memo)';

    DBMS_OUTPUT.PUT_LINE(V_SqlString);

    EXECUTE IMMEDIATE V_SqlString

    USING v_opt.id, v_opt.operationdomain, v_opt.name, v_opt.father, v_opt.url, v_opt.target, v_opt.Icon, v_opt.seq, v_opt.memo;

    END LOOP;

    V_SqlString := ' select * from TEMP_DOMAINOPERATION';

    OPEN V_CX FOR V_SqlString;

    END sys_Operation_Select;

    文章评论

    展开全文
  • 然后还需要查询的结果存储到临时表中。下面是创建临时以及插入数据的例子,以供大家参考。A、临时再断开于mysql的连接后系统会自动删除临时表中数据,但是这只限于用下面语句建立的:1)定义字段CREATE TE....

    今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取。我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些。然后还需要将查询的结果存储到临时表中。下面是创建临时表以及插入数据的例子,以供大家参考。

    A、临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:

    1)定义字段

    CREATE TEMPORARY TABLE tmp_table (

    name VARCHAR(10) NOT NULL,

    time date  NOT NULL

    )

    更高级点就是:

    create temporary  TABLE `temtable` (

    `jws` varchar(100) character set utf8 collate utf8_bin NOT NULL,

    `tzlb` varchar(100) character set utf8 collate utf8_bin NOT NULL,

    `uptime` date NOT NULL

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1″

    连编码方式都规定了。。呵呵,以防乱码啊。

    2)直接将查询结果导入临时表

    CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name

    B、另外mysql也允许你在内存中直接创建临时表,因为是在内存中所有速度会很快,语法如下:

    CREATE TEMPORARY TABLE tmp_table (

    name VARCHAR(10) NOT NULL,

    value INTEGER NOT NULL

    ) TYPE = HEAP

    那如何将查询的结果存入已有的表呢?

    1、可以使用A中第二个方法

    2、使用insert into temtable (select a,b,c,d from tablea)”;

    http://www.0377joyous.com/archives/152.html

    展开全文
  • 使用存储过程利用临时循环实现多修改update CREATE PROCEDURE [dbo].[UP_Pack_Detail_Update] ( @Types varchar(100) = NULL ) AS SET XACT_ABORT ON## 标题 BEGIN TRAN --构建临时 SELECT ROW_NUMBER() ...

    使用存储过程利用临时表循环实现多表新增修改update

    
    CREATE PROCEDURE [dbo].[UP_Pack_Detail_Update]
    (
    	@Types varchar(100) = NULL
    )
    AS
    SET XACT_ABORT ON## 标题
    	BEGIN TRAN
    
    --构建临时表
    SELECT ROW_NUMBER() OVER ( ORDER BY id) i,* INTO #A FROM 
    [pack_detail] where pack_no=@Types --in('N-C161--210318-010-001','N-C161--210318-010-002','N-C161--210318-010-003','N-C161--210318-010-004','N-C161--210318-010-005')
    				DECLARE @count INT;
    				SELECT @count=COUNT(1) FROM #A      --获取临时表#A 的总数量,用来循环;        
    				DECLARE @i INT=1;
    				WHILE(@i<=@count)                                  --循坏
    						BEGIN
    							DECLARE @thickness_grade2 NVARCHAR(200) = NULL;
    							DECLARE @thickness_grade NVARCHAR(200); 
    							DECLARE @thickness_avg  float;
    							DECLARE @thickness_avg2  float;
    							DECLARE @out_code NVARCHAR(200); 
    							DECLARE @pack_no NVARCHAR(200); 
    							
    							SELECT @out_code=m_no,@pack_no=pack_no FROM #A   where i=@i--获得临时表相应数据
    	select @thickness_grade2=thickness_grade_2,@thickness_grade=thickness_grade_1,@thickness_avg=thickness_avg_1,@thickness_avg2=thickness_avg_2 
    	from split_detail where out_code=@out_code
    							print @out_code
    							print @pack_no
    							print @thickness_avg
    
    							update [pack_detail] set thickness_grade=@thickness_grade,thickness_grade2=@thickness_grade2,thickness_avg=@thickness_avg,thickness_avg2=@thickness_avg2 
    							where  pack_no=@pack_no and m_no=@out_code
    							--避免死循环 @i +1;
    							SET @i=@i+1;         
    							
    							SELECT * FROM #A                          
    						END
    
    						--select * from [pack_detail] where pack_no in('N-415-495-210204-001-003') 
    				--千万要记得删除临时表 #A,否则下次执行会报错:“数据库中已存在名为'#A' 的对象”。
    				DROP TABLE #A  
    
    	COMMIT TRAN
    GO
    
    
    展开全文
  • 结果集存放到临时

    2021-02-08 04:03:00
    在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种。1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1要求目标Table2必须存在...

    在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种。

    1.INSERT INTO SELECT语句

    语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

    要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。

    2.SELECT INTO FROM语句

    语句形式为:SELECT vale1, value2 into Table2 from Table1

    要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。

    批量删除

    delete from table where id in (xxxxxxxx) 或者delete from table where id in ( select id from table where enabled = 0)

    INNER JOIN 连接三个数据表的用法:

    SELECT (表?).字段,(表?).字段 。。。  FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号

    如何使用EXEC里面创建的临时表

    当我这样创建临时表的时候可以使用:

    select * into #tmp from TableA;

    select * from #tmp;

    但是这样创建临时表却不可以使用:

    EXEC ('select * into #tmp from TableA');

    select * into #tmp from TableA;

    ------解决方案--------------------

    把SELECT..INTO 也写到EXEC里面去。

    ------解决方案--------------------

    如果后边还有用到临时表处理的东西,也写到exec中去。

    ------解决方案--------------------

    EXEC ('select * into #tmp from TableA;select * from #tmp')

    一. SELECT INTO

    1. 使用select into会自动生成临时表,不需要事先创建

    select * into #temp from sysobjects

    01. 把存储过程结果集SELECT INTO到临时表

    select * from #temp

    2. 如果当前会话中,已存在同名的临时表

    select * into #temp from sysobjects

    再次运行,则会报错提示:数据库中已存在名为 '%1!' 的对象。

    Msg 2714, Level 16, State 6, Line 2

    There is already an object named '#temp' in the database.

    在使用select into前,可以先做一下判断:

    if OBJECT_ID('tempdb..#temp') is not null

    drop table #temp

    select * into #temp from sysobjects

    select * from #temp

    3. 利用select into生成一个空表

    如果要生成一个空的表结构,不包含任何数据,可以给定一个恒不等式如下:

    select * into #temp from sysobjects where 1=2

    select * from #temp

    二. INSERT INTO

    1. 使用insert into,需要先手动创建临时表

    1.1 保存从select语句中返回的结果集

    create table test_getdate(c1 datetime)

    insert into test_getdate select GETDATE()

    select * from test_getdate

    1.2 保存从存储过程返回的结果集

    create table #helpuser

    UserName nvarchar(128),

    RoleName nvarchar(128),

    LoginName nvarchar(128),

    DefDBName nvarchar(128),

    DefSchemaName nvarchar(128),

    UserID smallint,

    SID smallint

    )

    insert into #helpuser exec sp_helpuser

    select * from #helpuser

    1.3 保存从动态语句返回的结果集

    create table test_dbcc

    TraceFlag varchar(100),

    Status tinyint,

    Global tinyint,

    Session tinyint

    )

    insert into test_dbcc exec('DBCC TRACESTATUS')

    select * from test_dbcc

    对于动态SQL,或者类似DBCC这种非常规的SQL语句,都可以通过这种方式来保存结果集。

    2. 不能嵌套使用insert exec语句

    2.1 下面这个例子,尝试保存sp_help_job的结果集到临时表,发生错误

    create table #JobInfo

    job_id uniqueidentifier,

    originating_server nvarchar(128),

    name nvarchar(128),

    enabled tinyint,

    description nvarchar(512),

    start_step_id int,

    category nvarchar(128),

    owner nvarchar(128),

    notify_level_eventlog int,

    notify_level_email int,

    notify_level_netsend int,

    notify_level_page int ,

    notify_email_operator nvarchar(128),

    notify_netsend_operator nvarchar(128),

    notify_page_operator nvarchar(128),

    delete_level int,

    date_created datetime,

    date_modified datetime,

    version_number int,

    last_run_date int,

    last_run_time int,

    last_run_outcome int,

    next_run_date int,

    next_run_time int,

    next_run_schedule_id int,

    current_execution_status int,

    current_execution_step nvarchar(128),

    current_retry_attempt int,

    has_step int,

    has_schedule int,

    has_target int,

    type int

    )

    insert into #JobInfo exec msdb..sp_help_job

    返回错误信息:INSERT EXEC 语句不能嵌套。

    Msg 8164, Level 16, State 1, Procedure sp_get_composite_job_info, Line 72

    An INSERT EXEC statement cannot be nested.

    展开错误信息中的存储过程:

    exec sp_helptext sp_get_composite_job_info

    发现里面还有个INSERT INTO…EXEC的嵌套调用,SQL Server在语法上不支持。

    INSERT INTO @xp_results

    EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner, @job_id

    2.2 可以用分布式查询来避免这个问题,这种写法在INSIDE SQL Server 2005中作者提到过

    (1)首先到打开服务器选项Ad Hoc Distributed Queries

    exec sp_configure 'show advanced options',1

    RECONFIGURE

    GO

    exec sp_configure 'Ad Hoc Distributed Queries',1

    RECONFIGURE

    GO

    (2)通过OPENROWSET连接到本机,运行存储过程,取得结果集

    使用windows认证

    select * into #JobInfo_S1

    from openrowset('sqloledb', 'server=(local);trusted_connection=yes','exec msdb.dbo.sp_help_job')

    select * from #JobInfo_S1

    使用SQL Server认证

    SELECT * INTO #JobInfo_S2

    FROM OPENROWSET('SQLOLEDB','127.0.0.1';'sa';'sa_password','exec msdb.dbo.sp_help_job')

    SELECT * FROM #JobInfo_S2

    这样的写法,既免去了手动建表的麻烦,也可以避免insert exec 无法嵌套的问题。几乎所有SQL语句都可以使用。

    --dbcc不能直接运行

    SELECT a.* into #t

    FROM OPENROWSET('SQLOLEDB','127.0.0.1';'sa';'sa_password',

    'dbcc log(''master'',3)') AS a

    --可以变通一下

    SELECT a.* into #t

    FROM OPENROWSET('SQLOLEDB','127.0.0.1';'sa';'sa_password',

    'exec(''DBCC LOG(''''master'''',3)'')') AS a

    1、判断数据表是否存在

    方法一:

    use yourdb;

    go

    if object_id(N'tablename',N'U') is not null

    print '存在'

    else

    print '不存在'

    例如:

    use fireweb;

    go

    if object_id(N'TEMP_TBL',N'U') is not null

    print '存在'

    else

    print '不存在'

    方法二:

    USE [实例名]

    GO

    IF EXISTS  (SELECT  * FROM dbo.SysObjects WHERE ID = object_id(N'[表名]') AND OBJECTPROPERTY(ID, 'IsTable') = 1)

    PRINT '存在'

    ELSE

    PRINT'不存在'

    例如:

    use fireweb;

    go

    IF EXISTS  (SELECT  * FROM dbo.SysObjects WHERE ID = object_id(N'TEMP_TBL') AND OBJECTPROPERTY(ID, 'IsTable') = 1)

    PRINT '存在'

    ELSE

    PRINT'不存在'

    2、临时表是否存在:

    方法一:

    use fireweb;

    go

    if exists(select * from tempdb..sysobjects where id=object_id('tempdb..##TEMP_TBL'))

    PRINT '存在'

    ELSE

    PRINT'不存在'

    方法二:

    use fireweb;

    go

    if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#TEMP_TBL') and type='U')

    PRINT '存在'

    ELSE

    PRINT'不存在'

    展开全文
  • 文章目录Oracle Live SQL存储过程如何创建一个存储过程查询存储过程调用存储过程方式一方式二方式三删除存储过程创建一个有参的存储过程创建一个有返回值的存储过程创建IN OUT的存储过程存储过程内部定义参数...
  • Oracle 创建用户及数据表的方法更新时间:2009年09月25日 23:13:29 作者:刚开始学习oracle的朋友可以看下,这个是基础了。一、概念1. 数据库 (Database)什么是数据库?数据库是依照某种数据模型组织起来并存放二级...
  • 数据库mysql存储中参出参理解

    千次阅读 2021-01-27 10:37:40
    有些小伙伴看到我们标题参形参不知道是什么意思,其实也不难理解。我们把出参和参看成输入和输出的意思就可以了。想必这样说大家就理解其中的意思,至于参和出参如何表示,我们一起往下进行详细的学习。...
  • 本篇文章介绍存储过程返回多个结果集时是什么结果,希望给大家以参考作用。mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders它的结构:...
  • 一、创建临时可以查询结果寄存。报表制作的查询sql可以用到。(1)关于寄存方式,mysql不支持:select * into tmp from maintenanceprocess(2)可以使用:create table tmp (select ...)举例:#单个工位检修结果...
  • 针对Oracle、MySQL、SQL Server、DB2等结构化数据,我们可以选择存储在关系型数据库。针对诸如视频、音频、文件等非结构化数据,又是如何存储呢?一般视频、大文件都不会直接存储在数据库,因为会严重影响性能。...
  • 原文链接:https://www.cnblogs.com/zhaowei303/articles/4204805.htmlSQL数据库中数据处理时,有时候需要建立临时查询后的结果集到临时表中,然后在针对这个数据进行操作。创建“临时”(逻辑上的临时,...
  • 刚入门oracle不久,最近有个测试的小任务,场景是模拟用户上线记录:查询用户,然后部分数据插入在线表中,插入一次commit一次。 先上代码: ```sql CREATE OR REPLACE PROCEDURE SYNCBUPT IS --创建存储过程,...
  • 今天 大神给了我一个存储过程定义语句要我玩。。。 可是我就没有写过存储过程,而且不喜欢。。。没办法,,,百度了一通: 下面是例子:drop procedure if exists proc_summary_data_report_daily;create procedure ...
  • 文章目录0J面试题 链表一、单链表1.1删除链表等于给定值val的所有节点1.2反转一个单链表1.3链表的中间结点1.4链表倒数第k个节点1.5合并两个有序链表1.6链表分割1.7删除链表重复的节点1.8链表的回文结构1.9环形...
  • LeekCode2_链表反向存储+求和(中等)

    千次阅读 2021-04-05 14:56:09
    题目 给你两个 非空 的链表,表示两个非负的整数。...就是取模后的数值放到结点,每次相加都算上进位的数,到最后判断如果进位数字大于一,再创建一个结点放入数值。 //两个数相加 public listNode2 addSum
  • 我的解决办法:1、对子查询b生成临时,用的时候往临时表中写入数据,查询完成即删除。 创建临时Create Global Temporary Table b(dcard varchar(20),dcount int,dsje numeric(12,2) )On Commit Preserve Rows; ...
  • Python2是MySQLdb模块。 Python3没有MySQLdb模块了,所以使用pymysql 2 操作Mysql数据库 创建连接,指定数据库的ip地址,账号、密码、端口号、要操作的数据库、字符集 创建游标 执行sql 获取结果 关闭游标 ...
  • 【顺序和链表】实现增删查改数据结构 OJ题编程

    千次阅读 热门讨论 2021-11-03 21:40:40
    线性表是一种在实际广泛使用的数据结构,常见的线性表:顺序、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以...
  • MySQL高级第二章——存储过程

    千次阅读 2021-03-11 14:15:04
    学习目标: 学会使用存储过程 学习内容: 创建与调用过程 学会使用变量 ...当创建存储过程被编译之后,就存储在数据库。 但是, MySQL 实现的存储过程略有不同。MySQL 存储过程按需编译。在编译存储
  • DECLARE @NAME SYSNAME --表名变量 DECLARE CSR CURSOR --定义一个游标 FOR SELECT NAME FROM ... FETCH NEXT FROM CSR INTO @NAME --游标向下移1行,获取的数据放入之前定义的变量@NAME WHILE (@@F
  • 如何在KingbaseES批量创建表和库? 2. 通过shell脚本文件实现 有时候我们在进行测试的时候需要进行批量的建库以及建表,这时我们可以使用shell脚本实现或者是SQL实现,shell脚本实现时内容如下: user=system ...
  • 数据结构】链表经典算法题集锦

    千次阅读 多人点赞 2021-09-12 11:02:29
    前言:本章将分享十一道来自LeetCode/牛客网的经典链表算法题来介绍数据结构链表在算法题的应用。 文章目录1.删除链表元素思路分析:题解:2.反转链表思路分析:题解:3.链表中间结点思路分析(快慢指针法)...
  • 如何动态执行存储过程或函数目前在Oracle数据库存储过程研发过程中,遇到需要从某张表读取存储过程名并进行动态执行的情况,经查找资料,制作成DEMO,并通过测试,现共享下,以备其他同事遇到此种情况时参考。...
  • 由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来存储过程里面. 这里就出现了一个问题,我花费 ... 【原创】3. MYSQL++ Query类型与SQL语句执行过程(非template与SSQLS版本) 我们可以通过使用...
  • #include<iostream> #include<fstream> #include<ctime> using namespace std; struct Node { int data; struct Node* next; }; typedef struct Node* PtrToNode;... List L =
  • 展开全部Java可以使用队列来保存62616964757a686964616fe59b9ee7ad9431333337613163数据,当使用的时候,加上锁,防止其他进程访问,当不用的时候保存到数据库里面,示例如下:packagecom.henry;importjava.util....
  • 顺序(数组)实现

    千次阅读 2021-12-15 12:35:52
    顺序是在计算机内存以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存储线性表的各个元素、使得线性表再逻辑结构上响铃的数据元素存储在相邻的物理存储单元,即通过数据...
  • 要求目标Table2必须存在,由于目标Table2已经存在,所以我们除了插入源Table1的字段外,还可以插入常量。 2.SELECT INTO FROM语句 语句形式为:SELECT vale1, value2 into Table2 from Table1 要求目标Table...
  • 介绍activiti7的数据表和各表字段的含义,对于学习activiti7工作流引擎的运行过程很有帮助!
  • 1、创建数据库:create ...3、创建表:create table 表名(id integer,name text,price numeric {精确度较高的小数型,同mysql的decimal});3-1、GP建表指定列级约束create table 表名(id integer primary key, {主键...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 346,985
精华内容 138,794
关键字:

存储过程创建表将数据放入表中