使用动态SQL进行批量收集

时间:2019-06-26 13:22:23

标签: oracle plsql dynamic-sql

我有一个动态获取表名和列名的要求,我需要获取数据并使用批量收集在表中插入/更新。据我检查,我将无法对使用动态表/列名称的动态SQL使用FORALL。请提出任何解决方法,以将数据批量插入集合中


Declare 
   Type Type_xx is table of varchar2(200);

   Lv_Coll  type_xx:=type_xx();
   Lv_Coll2   sys_refcursor;
   Lv_tab   varchar2(200):='C_Sample_1';
   Lv_Col   Varchar2(200):='SHORT_NAME';
   Out_tab  Varchar2(200):='Test';

Begin
   OPEN Lv_Coll2 FOR  'Select '||Lv_Col||' from '||Lv_tab||'';
        Loop
            Fetch Lv_Coll2 bulk collect into Lv_Coll limit 100;
            Exit when Lv_Coll.count < 100;
            forall i in Lv_Coll.first..Lv_Coll.last 
                Execute Immediate 'insert into '||Out_tab||' values ('||Lv_Coll(i)||')';
           End loop;
end;

出现错误

  

ORA-06550:第16行,第17列:
  PLS-00801:内部错误[*** ASSERT   在文件pdw4.c,行620;未知表达式Expr = 283。   Xanon__0x2b21bbdd8__AB [16,17]]

数据库版本为11.2.0.4.0

2 个答案:

答案 0 :(得分:1)

可能不是首选的解决方案,但是您可以将整个批量插入PL / SQL块放在EXECUTE IMMEDIATE语句中。

答案 1 :(得分:0)

这是一种实现方法:

from Django.shortcuts import render
import openpyxl
from .models import FileFieldForm


def index(request):
    if "GET" == request.method:
        return render(request, 'well/index.html', {})
    else:
        FileFieldForm = request.FILES["excel_file"]

        # you may put validations here to check extension or file size

        wb = openpyxl.load_workbook(FileFieldForm)

        # getting all sheets
        worksheet = wb.sheetnames
        print(worksheet)

        excel_data = list()
        # iterating over the rows and
        # getting value from each cell in row
        for sheet_name in wb.sheetnames:
            worksheet = wb[sheet_name]
            for row in worksheet.iter_rows():
                row_data = list()
                for cell in row:
                    row_data.append(str(cell.value))
                excel_data.append(row_data)
        return render(request, 'well/index.html', {"excel_data": excel_data})

我还没有完成提交。