简体   繁体   中英

Oracle parameterize finding column count of a table - ORA-00905: missing keyword

I am adding a number of columns to multiple tables. Before I add them, I want to make sure they don't exist already.

SELECT count(*)
INTO myCount
FROM user_tab_cols
WHERE column_name = 'newCol'
  and table_name = 'tableName';

Since the only variables are the tableName and columnName , I thought of parameterizing these two variables hoping to reuse it. So I wrote a pl/sql:

DECLARE
 myCount      NUMBER;
 COUNT_COLUMN VARCHAR2(1000) :=
        ' SELECT count(*)
    INTO myCount
    FROM user_tab_cols
    WHERE column_name = :1
      and table_name = :2';


BEGIN

EXECUTE IMMEDIATE COUNT_COLUMN using 'columnName','tableName';
/*code to check count and add column*/

DBMS_OUTPUT.PUT_LINE(myCount);


EXCEPTION
    WHEN
        OTHERS THEN
        DBMS_OUTPUT.PUT_LINE( 'sql failed: ' || SQLCODE || ': ' || SUBSTR(SQLERRM, 1, 200));
END;

I expected the myCount variable to contain number of columns in a table. But I get the following error.

sql failed: -905: ORA-00905: missing keyword

How do I get rid of this error? what other ways do I have to achieve this?

INTO cluase must not be included in SQL query but to be used in EXECUTE IMMEDIATE statement. So, You need to fix your dynamic SQL as below -

DECLARE
 myCount      NUMBER;
 COUNT_COLUMN VARCHAR2(1000) :=
        ' SELECT count(*)
    FROM user_tab_cols
    WHERE column_name = :1
      and table_name = :2';

BEGIN            -- Add the BEGIN keyword to complete a PL/SQL block

EXECUTE IMMEDIATE COUNT_COLUMN INTO myCount using 'columnName','tableName';
/*code to check count and add column*/

DBMS_OUTPUT.PUT_LINE(myCount);


EXCEPTION
    WHEN
        OTHERS THEN
        DBMS_OUTPUT.PUT_LINE( 'sql failed: ' || SQLCODE || ': ' || SUBSTR(SQLERRM, 1, 200));
END;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM