All we need is an easy explanation of the problem, so here it is.
I’m new to Oracle DB, coming from MS SQL Server.
I created this script:
DEFINE USER_NAME = &1
DEFINE PASSWORD = &2
DEFINE TABLESPACE = &3
CONNECT &DB_ADMIN/&[email protected]//localhost:1521/&DB_NAME
SET VERIFY OFF
SET SERVEROUTPUT ON
SET FEEDBACK OFF
DECLARE PROCEDURE Create_User
( userName IN VARCHAR2
, password IN VARCHAR2
, tSpace IN VARCHAR2
) AS
dbCount INTEGER := -1;
createStmt VARCHAR2(500);
BEGIN
SELECT COUNT(*)
INTO dbCount
FROM CDB_USERS u
INNER JOIN v$pdbs d ON u.CON_ID = d.CON_ID
WHERE d.NAME = '&DB_NAME'
AND u.USERNAME = userName;
IF dbCount > 0
THEN
EXECUTE IMMEDIATE 'DROP USER ' || userName || ' CASCADE';
DBMS_OUTPUT.PUT_LINE('User ' || userName || ' dropped.');
END IF;
createStmt := 'CREATE USER ' || userName || ' IDENTIFIED BY ' || password || ' DEFAULT TABLESPACE ' || tSpace || ' QUOTA UNLIMITED ON ' || tSpace;
DBMS_OUTPUT.PUT_LINE('User about to be created:');
DBMS_OUTPUT.PUT_LINE(createStmt);
DBMS_OUTPUT.PUT_LINE('');
DBMS_OUTPUT.PUT_LINE('Creating user ' || userName || ' ...');
EXECUTE IMMEDIATE createStmt;
DBMS_OUTPUT.PUT_LINE('Database ' || userName || ' successfully created.');
END Create_User;
BEGIN
Create_User('&USER_NAME', '&PASSWORD', '&TABLESPACE');
END;
/
When I run it in SqlPlus, like this:
SQL> DEFINE DB_NAME = 'MYDB'
SQL> DEFINE DB_ADMIN = 'SA'
SQL> DEFINE DB_PWD = 'pwd'
SQL> @/db-install/sql/add-user.sql 'USERNAME' 'pwd' 'TSPACE'
I get this error message:
Connected.
DECLARE PROCEDURE Create_User
*
ERROR at line 1:
DECLARE
*
ERROR at line 1:
ORA-01918: user 'USERNAME' does not exist
ORA-06512: at line 19
ORA-06512: at line 36
Can someone please point me to the right direction? What am I doing wrong?
Your answer is appreciated.
EDIT
I have this exact same code in another script, and it’s working fine there:
DEFINE DB_NAME = &1
DEFINE DB_ADMIN = &2
DEFINE DB_PWD = &3
CONNECT &DB_ADMIN/&[email protected]//localhost:1521/&DB_NAME
SET VERIFY OFF
SET SERVEROUTPUT ON
SET FEEDBACK OFF
BEGIN
DBMS_OUTPUT.PUT_LINE('Adding tablespaces to database ...');
END;
/
--- Procedure: dropping and creating a given tablespace ---
DECLARE
dbCount INTEGER;
createStmt VARCHAR2(500);
filePath dba_data_files.FILE_NAME%TYPE;
PROCEDURE Create_TS
...
EDIT 2
It doesn’t make a difference if I put the variables between DECLARE
and PROCEDURE
:
DECLARE
dbCount INTEGER := -1;
createStmt VARCHAR2(500);
PROCEDURE Create_User
( userName IN VARCHAR2
, password IN VARCHAR2
, tSpace IN VARCHAR2
) AS
BEGIN
Connected.
DECLARE
*
ERROR at line 1:
ORA-01918: user 'USERNAME' does not exist
ORA-06512: at line 19
ORA-06512: at line 36
How to solve :
I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.
Method 1
And that is a great example why you should never name your PL/SQL variables the same as column names.
set serveroutput on
DECLARE
PROCEDURE Create_User
( userName IN VARCHAR2
, password IN VARCHAR2
, tSpace IN VARCHAR2
) AS
dbCount INTEGER := -1;
createStmt VARCHAR2(500);
BEGIN
SELECT COUNT(*)
INTO dbCount
FROM DBA_USERS u
WHERE u.USERNAME = userName;
dbms_output.put_line('User count: ' || dbcount);
end;
begin
create_user('abc', 'abc', 'abc');
end;
/
User count: 26
The u.USERNAME = userName
filter is username = username
, which returns all rows where username is not null.
Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0