Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I think <code>%ROWTYPE</code> is a dead-end here. As far as I know there is way to extract useful metadata about a PL/SQL variable.</p> <p>But things are different if you can use an abstract data type (ADT, or "object"). It is more powerful, and kind of similar to <code>%ROWTYPE</code>. But it is not quite as convenient, and will make your initial code a little more complicated. You will have to pre-define the objects, and use them in your SQL.</p> <p>For example, replace code like this:</p> <pre><code>declare v_test tbl%rowtype; begin select * into v_test from tbl; end; / </code></pre> <p>with this:</p> <pre><code>declare v_test2 tbl_type; begin select tbl_type(msrp, some_other_column) into v_test2 from tbl; end; / </code></pre> <p>If that is acceptable, you can use dynamic PL/SQL for your updates:</p> <pre><code>--Create table, ADT, and test data create table tbl(MSRP varchar2(100), some_other_column varchar2(100)); create or replace type tbl_type as object ( msrp varchar2(100), some_other_column varchar2(100) ); / insert into tbl values('1', '1'); --Convert object to ANYDATA, process with dynamic PL/SQL declare my_tbl tbl_type := tbl_type('2', '3'); procedure UpdateByColumn(p_anydata in anydata, colName in varchar2) is v_typename varchar2(30) := p_anydata.getTypeName; begin execute immediate ' declare v_anydata2 anydata := :anydata; v_object '||v_typename||'; v_dummy pls_integer; begin v_dummy := v_anydata2.getObject(v_object); update tbl set '||colName||' = v_object.'||colName||'; end; ' using p_anydata; end; begin updateByColumn(anyData.convertObject(my_tbl), 'MSRP'); end; / --Show the new data select * from tbl; MSRP SOME_OTHER_COLUMN ---- ----------------- 2 1 </code></pre> <p><strong>UPDATE</strong></p> <p><code>%ROWTYPE</code> only exists in PL/SQL, there is no way to pass or convert those values. But you can store the record as a package variable, and then pass the name and type of that variable to your function. The function can refer to the record using dynamic PL/SQL, and then can convert it to a value to be used by the SQL.</p> <p>(This does not address the issue of changing multiple columns at once, it is just a demo showing a way to dynamically use a <code>%ROWTYPE</code>.)</p> <pre><code>--Create table and test data create table tbl(MSRP varchar2(100), some_other_column varchar2(100)); insert into tbl values('1', '1'); commit; --Create another table, tbl2, that will be used to update tbl --(The tables in this example have similar columns, but that is not --actually necessary.) create table tbl2(MSRP varchar2(100), some_other_column varchar2(100)); insert into tbl2 values('2', '2'); commit; --New function works by passing in names of global variables and --their types, instead of actual values. create or replace procedure UpdateByColumn( p_package_and_variable_name in varchar2, p_rowtype in varchar2, colName in varchar2) is begin execute immediate ' declare v_rec '||p_rowtype||' := '||p_package_and_variable_name||'; begin update tbl set '||colName||' = v_rec.'||colName||'; end; '; end; / --A test package that calls the function to update tbl. create or replace package test_package is tbl2_rec tbl2%rowtype; procedure test_procedure; end; / create or replace package body test_package is procedure test_procedure is begin select * into tbl2_rec from tbl2; UpdateByColumn('test_package.tbl2_rec', 'tbl2%rowtype', 'MSRP'); end; end; / begin test_package.test_procedure; end; / </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload