Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >动态Oracle过程-结构问题

动态Oracle过程-结构问题
EN

Stack Overflow用户
提问于 2016-05-26 05:24:26
回答 1查看 30关注 0票数 0

在创建存储过程方面,我似乎遇到了一些问题,我根本看不出问题的所在。我对甲骨文比较陌生。

我有一张长度未知的桌子。我所做的是创建一个存储过程,该存储过程将创建一个表,该表的宽度与从该表获取值的表的行数相同。也就是说,如果表有10个值,代码将创建一个宽10列的新表,等等。

我已经设法使初始代码正常工作,但现在我试图添加一些附加逻辑,但没有成功。

我想要实现的逻辑是这样的:

如果表不存在-创建IT

如果表EXSITS -简单地插入到IT中

我还没有为INSERT部分创建代码,因为我无法让第一部分工作。在我把计数和IF语句加进去之前,一切都很顺利。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    CREATE OR REPLACE PROCEDURE "MDWPROD"."WORKFLOW_VAR_PIVOT" IS
    v_sql varchar2(32767);

    -- for the first run ofthe procedure, we need to create the table
    DECLARE var_count INT;

    SELECT 
        COUNT(*) 
    INTO 
        var_count
    FROM 
        all_tables 
    WHERE 
        OWNER = 'MDWPROD'
        AND TABLE_NAME = 'RBI_PROCESSVARIABLE_WK';


    -- if var_count = 0 then the table does not exists, create it, otherwise proceed with other logic
    IF var_count = 0 THEN

        -- cursor to find out the maximum number of projected columns required
        CURSOR cur_proj_test IS
            SELECT DISTINCT 
                ID, 
                VARIABLE_REPORT_LBL
            FROM   
                MDWPROD.RBI_VARIABLETYPE_DM
            ORDER BY 
                ID;

         -- We now loop through the cursor, and build of the SQL string to CREATE and POPULATE the table 
        BEGIN
            v_sql := 'CREATE TABLE MDWPROD.RBI_PROCESSVARIABLE_WK AS SELECT VAR.PROCESS_ID';
            FOR i IN cur_proj_test
            LOOP

                -- dynamically add to the projection for the query
                v_sql := v_sql || ',MAX(CASE VT.VARIABLE_REPORT_LBL WHEN ''' || i.VARIABLE_REPORT_LBL || ''' THEN VAR.VALUE ELSE '''' END) AS "' || i.VARIABLE_REPORT_LBL || '"';

            END LOOP;

            v_sql := v_sql || ' FROM MDWPROD.RBI_VARIABLE_DM VAR INNER JOIN MDWPROD.RBI_VARIABLETYPE_DM VT ON VAR.VARIABLE_TYPE_ID = VT.ID WHERE VAR.CURRENT_IND = ''Y'' GROUP BY VAR.PROCESS_ID order by VAR.PROCESS_ID';

             -- Create table and populate it with all the relevant variable values
            EXECUTE IMMEDIATE v_sql;
        END;


    END IF;
END;

如能提供任何协助,将不胜感激。

原工作程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE PROCEDURE WORKFLOW_VAR_PIVOT IS
    v_sql varchar2(32767);


    -- cursor to find out the maximum number of projected columns required
    CURSOR cur_proj_test IS
        SELECT DISTINCT 
            ID, 
            VARIABLE_REPORT_LBL
        FROM   
            MDWPROD.RBI_VARIABLETYPE_DM
        ORDER BY 
            ID;

     -- We now loop through the cursor, and build of the SQL string to CREATE and POPULATE the table 
    BEGIN
        v_sql := 'CREATE TABLE MDWPROD.RBI_PROCESSVARIABLE AS SELECT VAR.PROCESS_ID';
        FOR i IN cur_proj_test
        LOOP

            -- dynamically add to the projection for the query
            v_sql := v_sql || ',MAX(CASE VT.VARIABLE_REPORT_LBL WHEN ''' || i.VARIABLE_REPORT_LBL || ''' THEN VAR.VALUE ELSE '''' END) AS "' || i.VARIABLE_REPORT_LBL || '"';

        END LOOP;

        v_sql := v_sql || ' FROM MDWPROD.RBI_VARIABLE_DM VAR INNER JOIN MDWPROD.RBI_VARIABLETYPE_DM VT ON VAR.VARIABLE_TYPE_ID = VT.ID WHERE VAR.CURRENT_IND = ''Y'' GROUP BY VAR.PROCESS_ID order by VAR.PROCESS_ID';

        -- un comment this line to print out the entire SQL statement
        -- dbms_output.put_line('Dynamic SQL Statement:-' || chr(10) || v_sql || chr(10) || chr(10));

        -- DROP TABLE before recreating it
        EXECUTE IMMEDIATE 'DROP TABLE MDWPROD.RBI_PROCESSVARIABLE';

        -- Create table and populate it with all the relevant variable values
        EXECUTE IMMEDIATE v_sql;
    END;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-26 05:41:32

可能还有其他问题(您从来没有说过您的确切错误),但是我立即看到begin关键字在错误的位置。您的声明应该位于begin关键字之前的顶部,执行语句应该放在后面。

我把东西搬来搬去。这应该能让你更接近你的目标:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE PROCEDURE "MDWPROD"."WORKFLOW_VAR_PIVOT" IS
    v_sql varchar2(32767);

    -- for the first run ofthe procedure, we need to create the table
    DECLARE var_count INT;

    -- cursor to find out the maximum number of projected columns required
    CURSOR cur_proj_test IS
        SELECT DISTINCT 
            ID, 
            VARIABLE_REPORT_LBL
        FROM   
            MDWPROD.RBI_VARIABLETYPE_DM
        ORDER BY 
            ID;

BEGIN

    SELECT 
        COUNT(*) 
    INTO 
        var_count
    FROM 
        all_tables 
    WHERE 
        OWNER = 'MDWPROD'
        AND TABLE_NAME = 'RBI_PROCESSVARIABLE_WK';


    -- if var_count = 0 then the table does not exists, create it, otherwise proceed with other logic
    IF var_count = 0 THEN


         -- We now loop through the cursor, and build of the SQL string to CREATE and POPULATE the table 
            v_sql := 'CREATE TABLE MDWPROD.RBI_PROCESSVARIABLE_WK AS SELECT VAR.PROCESS_ID';
            FOR i IN cur_proj_test
            LOOP

                -- dynamically add to the projection for the query
                v_sql := v_sql || ',MAX(CASE VT.VARIABLE_REPORT_LBL WHEN ''' || i.VARIABLE_REPORT_LBL || ''' THEN VAR.VALUE ELSE '''' END) AS "' || i.VARIABLE_REPORT_LBL || '"';

            END LOOP;

            v_sql := v_sql || ' FROM MDWPROD.RBI_VARIABLE_DM VAR INNER JOIN MDWPROD.RBI_VARIABLETYPE_DM VT ON VAR.VARIABLE_TYPE_ID = VT.ID WHERE VAR.CURRENT_IND = ''Y'' GROUP BY VAR.PROCESS_ID order by VAR.PROCESS_ID';

             -- Create table and populate it with all the relevant variable values
            EXECUTE IMMEDIATE v_sql;
    END IF;
END;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37462169

复制
相关文章
从问题出发,解密Oracle rdba结构
好奇心是我们学习过程中最好的老师,对于Oracle的研究和学习也是如此,在遇到未知的问题时要善于提出为什么。本文将从问题出发,和大家一起解密Oracle rdba结构。
数据和云
2021/09/23
5740
从问题出发,解密Oracle rdba结构
数据结构之动态规划问题
数据结构中动态规划应该算得上是你避不开的一道槛了吧!其重要性不言而喻,今天就整理下学习笔记分享出来。希望对读者朋友也能有帮助,文章基本框架如下:
小小詹同学
2019/05/13
5780
【oracle】存储过程
存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param1; If (判断条件) then Select 列名 into 变量2 from 表A where列名=para
赵腰静
2018/03/09
1.1K0
Oracle存储过程
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
颍川
2019/11/21
8800
Oracle存储过程
Oracle存储过程 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_
Java帮帮
2018/03/15
2.7K0
Oracle存储过程
Oracle 存储过程 PROCEDURE
一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。
星哥玩云
2022/08/16
6490
oracle存储过程语法
前两天无意见看见了一个非常适合学习Oracle附上链接:https://blog.csdn.net/yucaifu1989/article/details/15813793
全栈程序员站长
2022/09/13
9130
入门级Oracle存储过程 | oracle
-- 第一个存储过程 hello world CREATE OR REPLACE PROCEDURE sayHello AS word VARCHAR2(10) := 'hello'; BEGIN dbms_output.put_line(word); END; --Execute BEGIN sayHello(); END; -- 创建学生表 CREATE TABLE student ( uuid NUMBER(6, 0) PRIMARY KEY, userna
AlicFeng
2018/06/08
7160
oracle存储过程语法和用法,oracle存储过程 语法 函数 总结
4、 查看编译错误:在命令窗口中show errors procedure procedure_name
全栈程序员站长
2022/09/13
1.3K0
Oracle存储结构
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
7100
Oracle存储结构
[亲测可用]hibernate调用Oracle存储过程|Spring Data JPA调用Oracle存储过程方法
一、前言 我们知道在plsql里可以通过下面方式执行存储过程, begin P_ACCOUNT(202004270000) ; end; --或者 call P_ACCOUNT(2020042
小小鱼儿小小林
2020/06/24
2.4K0
Oracle-Oracle数据库结构
之前写了一篇文章《Oracle-知识结构漫谈》 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新。
小小工匠
2021/08/16
2K0
Oracle函数和存储过程
1.函数 CREATE OR REPLACE FUNCTION myfun(eno in emp.empno%TYPE, tmp in out emp.ename%type) RETURN varchar2 AS BEGIN SELECT ename INTO tmp FROM emp WHERE empno = eno; return tmp; END; DECLARE tmp emp.ename%type; l_tmp emp.ename%type; BEGIN tmp := ''; l
提莫队长
2019/03/01
8010
Oracle函数和存储过程
[Oracle集群软件全解析] Oracle 集群启动过程
通过以上我们对集群有了一定的认识,这节我们介绍Oracle 11g 集群的启动过程
bsbforever
2020/08/18
1.5K0
oracle存储过程相关整理
存储过程是 SQL, PL/SQL, Java 语句的组合, 它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。是存放在数据库服务器上的SQL语句块,其效率高于同等SQL语句6-10倍
全栈程序员站长
2022/09/07
8390
oracle存储过程相关整理
oracle数据结构
 数据类型: 1 字符数据:CHAR VARCHAR NCHAR NVARCHAR2 LONG CLOB NCLOB  2 数字数据类型:NUMBER 唯一用来存储数字型的类型 3 日期数据类型: 4 raw解释型 串联: ||   NUM1 || NUM2  = "12"(num1 =1 num2 = 2) NULL: NULL=NULL也为假。NULL不等于任何值,包括自己 表:行的集合 视图:通过SQL语句来定义的 索引:如果建立索引的列包含的值为NULL,那么索引不会包含这行数据 B*树的深度取决于
用户1154259
2018/01/18
6000
Oracle数据结构
数据块是Oracle存储和数据操作的最小单位,但不一定和操作系统的os块相同,一个数据块可能有多个os块构成。
职场亮哥
2020/10/10
9590
Oracle数据结构
Oracle存储过程详解(一)
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子:
全栈程序员站长
2022/09/13
1.9K0
Oracle的常见问题汇总(1)——​Oracle中的JOIN的整理和结构分析
oracle中的join的整理和结构分析 在Oracle中的join主要分为: 外连接(outter join),内连接(inner join),自身连接(self-join) 外连接(outter join)又分为左外连接(left outer join)、右外连接(right outer join)、全外连接(full outer join)。在sql语句(structured Query Language)是:table_1 left/right/full outer join table_2,通常我
用户1257215
2018/01/30
1.1K0
Oracle的常见问题汇总(1)——​Oracle中的JOIN的整理和结构分析
Oracle 动态SQL「建议收藏」
一、动态SQL的简介 1、定义 静态SQL是指直接嵌入到PL/SQL块中的SQL语句。 动态SQL是指运行PL/SQL块是动态输入的SQL语句。
全栈程序员站长
2022/09/09
1.6K0

相似问题

Oracle -动态选择过程

10

ORACLE存储过程问题

10

oracle中的动态过程

19

如何通过PL/SQL绑定问题将结构传递给oracle过程

13

Oracle存储过程的问题

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文