Oracle
 sql >> база данни >  >> RDS >> Oracle

Отворете курсора за име на динамична таблица в PL/SQL процедура

Бих направил това като единична инструкция за вмъкване като избор, усложнена само от факта, че предавате table_name, така че трябва да използваме динамичен sql.

Бих го направил нещо като:

CREATE OR REPLACE PROCEDURE some_name(p_table_name IN VARCHAR2,
                                      p_chunk_size IN NUMBER,
                                      p_row_limit  IN NUMBER) AS

  v_table_name VARCHAR2(32); -- 30 characters for the tablename, 2 for doublequotes in case of case sensitive names, e.g. "table_name"

  v_insert_sql CLOB;
BEGIN
  -- Sanitise the passed in table_name, to ensure it meets the rules for being an identifier name. This is to avoid SQL injection in the dynamic SQL
  -- statement we'll be using later.
  v_table_name := DBMS_ASSERT.ENQUOTE_LITERAL(p_table_name);

  v_insert_sql := 'insert into chunks (common_column_name, chunk_number)'||CHR(10)|| -- replace the column names with the actual names of your chunks table columns.
                  'select common_column,'||CHR(10)||
                  '       ora_hash(substr(common_column, 1, 15), :p_chunk_size) AS chunk_number'||CHR(10)||
                  'from   '||v_table_name||CHR(10)||
                  'where  rownum <= :p_row_limit';

  -- Used for debug purposes, so you can see the definition of the statement that's going to be run.
  -- Remove before putting the code in production / convert to proper logging code:
  dbms_output.put_line(v_insert_sql);

  -- Now run the statement:
  EXECUTE IMMEDIATE v_insert_sql USING p_chunk_size, p_row_limit;

  -- I've included the p_row_limit in the above statement, since I'm not sure if your original code loops through all the rows once it processes the
  -- first p_row_limit rows. If you need to insert all rows from the p_table_name into the chunks table, remove the predicate from the insert sql and the extra bind variable passed into the execute immediate.
END some_name;
/

С помощта на единичен израз за вмъкване като избор вие използвате най-ефективния начин за извършване на работата. Извършването на груповото събиране (което използвахте) би изразходвало памет (съхраняване на данните в масива) и би причинило допълнителни контекстни превключвания между PL/SQL и SQL машините, които операторът вмъкване като избор избягва.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на Java за свързване към база данни на Oracle

  2. Oracle:Разлика между връзки без пул и DRCP

  3. Какво е значението на символа „@“ в Oracle SQL?

  4. Конкатениране на резултати от SQL заявка в Oracle

  5. как да използвате XMLImporter и FndXdfCmp в Oracle EBS