Friday, October 29, 2010

OBIEE: Evaluate

I haven't had a whole lot of opportunities to use this function. It's actually so rare, that I forget how to use it.

In the fine tradition of documenting everything, here I go.

Evaluate Syntax:
EVAULATE('your db function(%1,%2)', parameter list)
The reason I need to use it is because we are removing a view that has some fun SUBSTR/INSTR action in it. I tried writing it up in OBIEE SQL, but it doesn't allow you to traverse from the end of the string...well, someone out there probably could, but I like to limit this kind of thing in the RPD, preferring instead to put it in the database. As much as we'd like to believe it, OBIEE will not be the only application accessing this data. But I digress.

Here's the original Oracle SQL:
SUBSTR( col1, INSTR( col1, '/', -1 ) + 1 )
Which reminds me of something else...there is no real way to test this stuff in the admin tool (RPD). You have to create it there and then create an ad-hoc report to make sure it's working as it should. Rather than deal with that, I just started in Answers.

First go:
EVALUATE( 'SUBSTR( %1, INSTR( %1, '/', -1 ) + 1 )', '/TESTING/TESTING1/TESTING2/REPORT_NAME' )
This resulting in the following when I hit OK:



OK, my bet is that those single quotes inside the single quotes were the cause. So I tried variations of 2 single quotes, 3 single quotes and even double quotes. None of those worked either.

What if I just put that '/' in the parameter list?
EVALUATE( 'SUBSTR( %1, INSTR( %1, %2, -1 ) + 1 )' , '/TESTING/TESTING1/TESTING2/REPORT_NAME', '/')
Voila! Yay for me.

Wednesday, October 27, 2010

Customer Service

Recently, I received a message via LinkedIn from a Product Manager at Oracle.

I won't say who, just because I wouldn't want to get them into any trouble.

The email was fairly general, mostly asking if I had used their product and if I had any questions. Well, I hadn't used that particular product, but I did have questions as it falls into my DW/BI realm.

So I sent my questions.

Within a day or so, I had this long, very detailed description about the differences between the 2 products and why one would choose one over the other (both products were Oracle products). It also included customer examples (sans customer names of course) of who is choosing what and when.

I love these kinds of exchanges. I love having the ability to ask questions of people who manage products because you get real insight into how they are thinking.

I believe this speaks volumes for this individual specifically and Oracle in general. I know Oracle isn't perfect by any means, but what company of that size is? This person wanted to make sure that I was informed, reached out to me, and provided me with the answer to my questions.

I certainly wish there were more people like this (not just at Oracle). After having sat in on an Exadata PoC, I can appreciate it that much more since I never get to spend the money. So thank you anonymous Oracle employee, you set a good example for quite a few people.

Tuesday, October 26, 2010

Google Is Stalking Me

Last week I was doing some research on buy vs. leasing a server/workstation.

Ultimately, I decided to buy one, this one.



I bought it because Amazon was just too expensive (for my purposes) and so was collocating a server (I wanted something a little more beefy than normal). I wasn't about to pay $1000 a month.

During that research, I made it to Storm website (on demand hosting). I'm not sure if I actually clicked on an advertisement on the result page of my Google search or what...but now they are everywhere.

I went to 4 sites today, and here's what I found:

wunderground.com



forum.xda-developers.com



somethingawful.com



linuxquestions.org



addictivetips.com



factmag.com



It's just a tad creepy, but I may be to blame for click on an advertisement (still unsure). Anyone out there experience something like this before?

Wednesday, October 20, 2010

DDL Auditing - Revisited

Of course I can't find the post(s) that I read recently, but they were all concerning auditing DDL. The most desirable solution is to use the built in auditing providing by Oracle...the only problem with auditing, in general, is that no one really monitors it. I'm sure there are numbers out there (read about that too, but can't seem to find the post). Oh wait, I found it, it was a video that I got via the Database Insider newsletter. You can see it here.

The gist of that video (as cheesy as it may be), is that some broker figures out a way to submit trades with his account that don't really exist. He's paid the commission, automatically, some $10 million. The Risk/Security Officer talks about the amount of time (months) they spent trying to track down how it was done. They were at least smart enough to have auditing turned on, however, they never monitored it. Somehow, all this led me to DDL auditing. No idea how, it just did.

After thinking about it for a few days, I realized the similarity between that and my PMDV project I did last year. It only made it to version 0.1, but this gave me the idea to revisit it. Maybe it was just poor naming/branding (PMDV stands for Poor Man's Data Vault)? Maybe it did just suck eggs? Tough to say for sure.

To sum it up quickly, it required a "ticket number" or "work order" to set an application context. Without that application context set, you could not perform any DDL. On top of that, it would record all the DDL changes performed during that deployment window and give you decent reporting through an APEX front end. Like I said in one of those other posts, a former company of mine had to provide the security team with audit reports for each deployment. While the built-in auditing would capture all this, what I created will at least capture that in one place and provide the objects that change.

So perhaps this falls into the Change Management landscape (which is on my radar again...big, big topic).

Guess what, I just remembered how I came to remember this...a conversation on Twitter with @hillbillytoad and @krisrice...that's what led me to the DDL trigger and auditing. I think Kris suggested that a DDL trigger should be installed to prevent little old me from doing damage. :)



That link led to here and then a few other places...

Monday, October 18, 2010

OOW 2010: Blogger Meetup - The Winner!

After waiting for Vanessa to get back from either OOW Detox, vacation, or just life, the winners of the Apple TV have finally been announced.

Sunil Ranka, this guy:



Won one (yes! more than 1) of the Apple TVs with his post Mapping the Maze, Online Bloggers to Real World Faces : Pythian Blogger Meetup at OOW10.

Guess who won the other one? Go ahead, take a moment.

Part I - Part II - Part III - Part IV - Part V

You know when the teacher says, "I need a one page paper on George Washington" and one of your classmates turns in 10 pages, like, the week before it's due? Apparently I'm that guy.

I may have scared off a few people from writing about the event. That wasn't my intention, but apparently I did want it.

So, my first Apple product (wifey does have an iPhone). It should be interesting, I'm sure I'll report back here once I figure it all out.

Thanks to Pythian, HP and OTN for supporting the event. Thanks to Pythian for giving away the Apple TV.

Thursday, October 7, 2010

OBIEE 11g: Connect to Online Repository

I have been doing a quick and dirty proof of concept on 11g. The 32 bit installation went very smoothly on Monday, and then the hard work began.

11g was quite different from 10g and possibly the biggest differentiator was its integration with the WebLogic stack. While I do understand that move, it certainly makes things a more complex in the short run.

So I'm up and running and have the first RPD installed (that's another post, deploying an RPD...joy!), then the change requests begin to roll in. When I would try to open the RPD in online mode, I was greeted with this challenge:



OK, I know the repository password, but I don't remember setting an Administrator password (that was the default username). I tried everything I could think of, Admin123, which is the repository password for the sample application. Tried password. Tried every variation of it. No joy.

In the interest of time (and pressure), I gave up and just decided to edit the offline and then deploy. I was the only one on this system so I wouldn't be affecting anyone. In hindsight, it would have been best to ask my question (or read the docs).

A day later 2 more people joined me to help nail down some reports. I couldn't bring the server down everytime I needed to make a small change, so I asked the Twitter Machine...as usual, it comes through.

Here's the response:



@siebel_ess's link took me to the documentation. @bsousapt's link took me to the 10g way of doing it, which is actually a good compare and contrast as I'm too lazy to show the differences.

Perhaps on purpose, the first link led me to this page:



I'm sure the emphasis, for me, should have been placed on the "Understanding" part of the title.

So first off, I needed to log in to the console at localhost:7001/console. From there I would look for Security Realms:



Since I didn't do any customization of the Security stuff (naturally), I went to the default "myrealm":



Then found Users and Groups



And selected New



The screen is pretty basic, just username, description (optional), Provider (DefaultAuthenticator for me) and the password:



Annoyingly to me, you couldn't add any other attributes, like Group Membership on this initial screen. So I saved, then clicked on the user and was taken to their settings page...where I now find Groups.



This is my account, so I chose the 3 Groups related to OBIEE: BIAdministrators, BI Authors, and BIConsumers



Easy enough.

Now let's try it out. Opened up the BI Admin tool and opened my online repository. Entered the repository password, my username and the password.

Voila! I'm in.

Just an FYI, I am a glutton for punishment. I deployed 20 some-odd times before I finally looked this up. While not the most efficient, it did sear the process into my brain.

Wednesday, October 6, 2010

OBIEE 11G: Connection Gotchas

Doing a quick PoC, I've had to spin up 11g on very short notice. While anarchy is fun, I typically prefer a more guided approach.

Despite not reading documentation ahead of time (much), there is a method to my madness. I learn best by breaking stuff...multiple times.

So, there I am, fresh from exporting from Discoverer then migrating that RPD from 10g to 11g...configuring the Connection Pools. I select a random table and then hit View Data.



Awesome. Very descriptive.

I tried using the BI ODBC Client tool to test the connection.



Awesomer.

Using the Google Machine, I found this reference to Visual Basic (is that really still used?).

Let's try looking something else up (like the documentation you say?). Actually, I didn't find it, a colleague did.

Over on the Siebel Essentials blog, tip #4 for OBIEE 11g, Connections.

To sum it up, you can either use the tns entry as the Data Source Name or you must put a tnsnames.ora file in the <ORACLE_HOME>\OracleBI1\network\admin folder.

Awesomest.

Tuesday, October 5, 2010

OBIEE: obieerpdmigrateutil.exe

I needed to quickly spin up an OBIEE 11g instance (Windows Server 2003, 32 bit) for a PoC. The install went smoothly (unlike my other attempts on a 64 bit Windows environment). With the database and the application server, the machine is running at about 2.5 GB of RAM, 4 is recommended to simply install (including 11 GB of free space).

Anyway, after migrating my Discoverer EUL over to OBIEE, and figuring out the new file structure, I opened up the RPD and received the following goodness:



Yes, I should really read the documentation. I have been, apparently just haven't gotten to that part yet. (Admittedly, I've been reading from the 50,000 foot level).

In the bin directory (which isn't where it used to be) is a utility called obieerpdmigrateutil.exe

To run it issue the following from the command line:
<ORACLE_HOME>\instances\instance1\config\OracleBIServerComponent\coreapplication_obis1>obieerpdmigrateutil.exe 
-i <ORACLE_HOME>\instances\instance1\bifoundation\OracleBIServerComponent\coreapplication_obis1\repository\obiee_10g.rpd
-u Administrator
-L obiee_10g_diff
-O <ORACLE_HOME>\instances\instance1\bifoundation\OracleBIServerComponent\coreapplication_obis1\repository\obiee_11g.rpd
You'll be prompted for the Administrator password (which I left blank) and then an encryption password which becomes your new Administrator password.
Please enter the 10g Admin password:

Please enter the encryption password
New_Admin_Passw0rd
Parameters for the utility are as follows (and you must use them all)
obieerpdmigrateutil  -I repository_path
-O new_rpd_path
-L LDIF_file_path
[-U 10g_admin_username]
[-8]
-O Generate output repository.
-I The path of a repository.
-L Generate LDIF file for users and groups in the repository.
-U Name of a user with Administrator privilege in the 10g RPD
-8 Use UTF-8 encoding for LDIF file.
-h Display this usage information and exit.
More on this tool and when it should be used (MUD) here.

Monday, October 4, 2010

Never Use RAISE_APPLICATION_ERROR Again

By Michael O’Neill
http://twitter.com/cleverideanet (professional)
http://twitter.com/oraclenude (personal)
oraclenerd articles

If you write Oracle PL/SQL, you know what RAISE_APPLICATION_ERROR is. It is an abomination of hard-coding and poor practice. If you didn't know that, I'm sorry I was the one who told you. I've written and used extensively an ultra-simple framework to eliminate RAISE_APPLICATION_ERROR from my code forever.
Here's an example (assume 11gR2) of something we all know we can do:
begin  dbms_output.put_line(1/0); end;
This will throw an unhandled ORA-01476 exception. We could write some meaningful handling of that with this:
begin 
dbms_output.put_line(1/0);
exception
when zero_divide
then
dbms_output.put_line('zero divide exception caught');
end;
This coding is elegant because Oracle has conveniently predefined an exception named ZERO_DIVIDE and a corresponding pragma for us. Unfortunately, Oracle has only 22 predefined exceptions. What happens when I do this:
declare
d date;
begin
d := to_date('2010-09-30', 'YYYY-MM-DD'); -- works
dbms_output.put_line(d);
d := to_date('12345-09-30', 'YYYY-MM-DD'); -- fails
dbms_output.put_line(d);
end;
This will throw an unhandled ORA-01861 exception. My option to handle this is less than meaningful because this is not a predefined exception:
declare
d date;
begin
d := to_date('2010-09-30', 'YYYY-MM-DD'); -- works
dbms_output.put_line(d);
d := to_date('12345-09-30', 'YYYY-MM-DD'); -- fails
dbms_output.put_line(d);
exception
when others
then
case sqlcode
when -1861
then
dbms_output.put_line('literal does not match exception caught');
else
raise;
end case;
end;
This leads me to the inevitable desire to create my own named exception and pragma, so I could have code that looks like this instead:
declare
d date;
begin
d := to_date('2010-09-30', 'YYYY-MM-DD'); -- works
dbms_output.put_line(d);
d := to_date('12345-09-30', 'YYYY-MM-DD'); -- fails
dbms_output.put_line(d);
exception
when error.ora_literal_string_mismatch
then
dbms_output.put_line('literal does not match exception caught');
end;
Understanding this, creating my own ERROR package with a friendly named exception and pragma for ORA-01861 leads me to the pattern of how to handle my own application exceptions, namely defining an exception and pragma.

But how does this get RAISE_APPLICATION_ERROR out of my life? Consider the ERROR abbreviated package source I use (full source: error.pks and error.pkb):
create or replace package error is

package_name constant varchar2(32) := 'error'; -- in case you want to change the package name

-- application exceptions and pragmas

(snip)

not_one_based constant string(64) := package_name || '.app_not_one_based';
app_not_one_based exception;
pragma exception_init(app_not_one_based, -20004);

sparsity_not_allowed constant string(64) := package_name || '.app_sparsity_not_allowed';
app_sparsity_not_allowed exception;
pragma exception_init(app_sparsity_not_allowed, -20003);

parameter_cannot_be_null constant string(64) := package_name || '.app_parameter_cannot_be_null';
app_parameter_cannot_be_null exception;
pragma exception_init(app_parameter_cannot_be_null, -20002);

string_too_large constant string(64) := package_name || '.app_string_too_large';
app_string_too_large exception;
pragma exception_init(app_string_too_large, -20001);

application_exception constant string(64) := package_name || '.app_application_exception';
app_application_exception exception;
pragma exception_init(app_application_exception, -20000);

-- rdbms exceptions and pragmas

(snip)

literal_string_mismatch constant string(64) := package_name || '.ora_literal_string_mismatch';
ora_literal_string_mismatch exception;
pragma exception_init(ora_literal_string_mismatch, -1861);

(snip)

procedure throw(p_exception in varchar2);

procedure throw
(
p_exception in varchar2
,p_message in varchar2
);

end;
You can see several user-defined exceptions and pragmas as well as the ORA_LITERAL_STRING_MISMATCH used in the previous example. The full source has more defined, but is not relevant to understanding the concept I am presenting.

Notice there is just one (overloaded) method, THROW. THROW is what I use instead of RAISE_APPLICATION_ERROR.

So, instead of this:
declare
s string(3) := 'abc';
begin
if (instr(s,'b') > 0)
then
raise_application_error(-20000, 'I hate the letter b');
end if;
end;
I use this:
declare
s string(3) := 'abc';
begin
if (instr(s,'b') > 0)
then
error.throw(error.application_exception, 'I hate the letter b');
end if;
end;
On its surface this doesn’t seem terribly interesting or useful. Below the surface, several powerful advantages are gained:
  • A single ERROR package encapsulates a schema’s application exceptions and pragmas, giving me a consistent SQLCODEs returned to my C# code.
  • No more, remembering what number to use in RAISE_APPLICATION_ERROR.
  • Easier to understand code
  • I can effectively organize my exceptions without sprawling them throughout a schema’s packages
  • I can extend the ERROR package (and I have) to do many more things like logging or default messages for exceptions without writing that into my schema’s application packages.
How does it work? Taking a look at the body for the THROW method reveals all:
procedure throw
(
p_exception in varchar2
,p_message in varchar2
) is
begin
begin
begin
execute immediate ('begin raise ' || p_exception || '; end;');
-- exception is raised and immediately trapped
exception
when ora_plsql_compilation_error then
throw(error.exception_does_not_exist, p_exception);
end;

exception
when others then
if sqlcode between - 20999 and - 20000
then
raise_application_error(sqlcode, p_message);
-- this is the best/only use of raise_application_error
-- and eliminates the need in application code
else
raise;
-- nothing extra to do for extra for exceptions outside raise_application_error range
end if;
end;
exception
when others then
raise; -- finally, bubbles up the original throw() call
end throw;
There are few caveats I have using this development pattern. I don’t consolidate every exception I write into my ERROR package, only those exceptions that I want to bubble up unhandled to my C# code. I don’t feel it is necessary to have the same ERROR package in every application schema. In other words I don’t evolve every incarnation of my ERROR package when I’m adding exceptions and pragmas to one schema’s ERROR package. Finally, my ERROR package has a multitude more bells and whistles I’m not sharing in this post for clarity’s sake. If you are interested in a more extended version of my ERROR, let me know via Twitter (@cleverideanet)

Copyright © 2010 Michael O'Neill
Published by Permission on oraclenerd

Sunday, October 3, 2010

OOW 2010: The Appreciation Event

By: Anonymous Unicorn
This post started as an email from a friend of mine (yes, I have one or two), who is also my unicorn (someone who has worked with me and would consider it again, there are so few). I thought it was funny and asked him immediately if I could post it, he agreed, but wanted to expand a little bit.

I did not attend the appreciation event, I gave my ticket away. At the Blogger Meetup, I looked at the lines to get on the buses and I didn't want any part of it. I gave my ticket away.


At the OpenWorld appreciation event they split out their 6 bands on two stages going simultaneously all night. They went all out...there was a carnival in the back where the rides and games were free. Of course with 41,000 people attending OOW the obvious drawback would be transportation, so being on the most popular bus route meant the better part of an hour standing in line both to and from the event. That was expected, but it was the food situation that stuck in my mind.

When we arrived, we swam through masses of people, Berlin playing on the outside stage, and English Beat playing inside a sound stage next door. Not having eaten in 7 hours, the goal was food and drink. After examining the two stages, and seeing no signs of food and drink, I had to get out the map. Everything was in the back, so away we headed following the masses. We got to the food tent...huge tent, nicely decorated inside and out. No food was visible, but we could see clusters of people surrounding what appeared to be circular table configurations, looked like a shark feeding frenzy. Must be food! We tried to lean into one of the feeding stations, and while we realized it was in fact food, being 5 people deep, I couldn’t identify what was there.

Fortunately a server came by and said there were 23 food stations in two tents and the second tent was less busy. We quickly retreated and shuffled amongst the heavy crowd, out of one tent and into the next. This one had 4 long buffets and a handful of feeding stations. While we could actually see what was being served here, the problem was everyone in this tent queued up and lines were LONG.

I stood in one line for a bit and realized that no one else knew what was going on either, they just got in line because that seemed to be the thing to do. These are all highly paid professionals acting like carnal beasts in one tent or lemmings in the other, men, women, old, young, no difference. To me both options were ridiculous so I went over to see what was actually on the table... it wasn't even food...just hors d’oevres like cheeses and grapes! Starving, I cut in real quick (which didn’t affect the stagnant line) grabbed a small paper plate and put a spoonful of couscous on a plate with a few grapes and stood off to the side devouring it within 6 steps as I scanned for the real food.

There it was! Small ribs, fancy spaghetti, can’t even remember what else was there because I never got the opportunity to eat it, but I decided to try by finding the end of the line... I kept walking until I realized I’d rather starve than stand in a line that long. I calculated each 4 table station is supposed to serve as many as 2000 people, and understood what the real situation was: survival. I took my small, but at this point, very valuable plate, and cut in for a few small ribs and decided to go watch Berlin until the lines died down. For now the immediate hunger had simmered down.

I watched Berlin for a few songs, shuffled in to see a few Don Henley songs in the sound stage, then reversed right back out to get in position for the Black Eyed Peas (because they decided to put their two best acts on at the same time). I suppose I made the mistake of trying to get close but standing on the floor and being less than 6’4” tall, all I could do was watch the otherwise very nice screens. A girl all of 5 foot tall stood between me and the stage holding up a stuffed dog as high as she could and made it dance with every song... it was all she could do because I’m not certain she could even see the video screens... great show, and worth the effort to come. When it ended at 11:30pm I made a beeline back to the food tents. I was alone at this point because it was 2:30am eastern time.

Mistake. Both tents looked like apocalyptic wastelands with tired people trudging along table to table, tent to tent to find food. People were tired and in much fewer numbers. Some were collapsed at the few tables around the edges, and scavengers were picking scraps off the feeding stations, still in lines, and many lines had more people than food. The whole thing was surreal. There was actually some couscous left, but since last time they had introduced a few plates of brownies and cookies here and there. When you’re hungry, cookies just don’t cut it, so I dove in for some more couscous and a couple brownies, and after scanning both tents realized it was a cookie or nothing. One table left, a couple plates of cookies, no line.. it was like heaven!

So I’m pretty thirsty by now... and no, there were no drinks in the food tents that I ever identified. Fortunately the beverage booths around the carnival were still well stocked and hardly any lines at this point. I got a half-can of sierra mist (I guess it exists because it fits nicely in a cup with ice) and tried to figure out what to do next. Lots of people left, but apparently the carnival games are free, and unlike the food lines, these lines were moving ok. I can’t leave without trying can I? I decided to try 1 game, chose the game with the biggest prize and stood in the 4-line basketball game for 20 minutes watching hundreds of shots, most of which didn’t hit the rim or even the backboard. One girl won in my line, which I thought was awesome, because it’s actually possible to win. The guy in front of me talked a lot of trash and spent a lot of time plotting his strategy only to brick it like the others. Two shots each, my first shot was a brick too....second went right in! It’s true those rims barely fit the ball, but it is possible! That large stuffed animal forced me to check in a bag on the flight home, but my daughter loved it.

I caught several Steve Miller songs on the way out... it was awesome, I forgot how blues oriented he is, but I knew I had very little sleep ahead of me, so I had to cut out early and back to the buses I went. Lucky #13 bus line was 5 times as long as any other bus line and in retrospect I might have been better off being dropped off somewhere in the middle of San Francisco 3 miles from my hotel at 1am than to stand in that line... but like a good lemming, I stayed, knowing that not many hours later is my next session, and the next night would be spent on a plane rather than in a bed, heading back to the East Coast. But it was worth it.

Discoverer to OBIEE Migration Utility

I couldn't find a whole lot of information on this utility, so of course I'm putting it up here for my own reference.

File name is called migrateEUL.exe and is located in the OracleBI\server\bin directory.

It's not very difficult to run, just type in:
c:\migrateeul file.eex
Easy.

To generate the eex file from Discoverer, open up the Discoverer Administrator tool and then connect to the eul you want to export.

Cancel out of the Load Wizard



Then go to File, Export and select the business areas you want to export.

You'll be prompted to name that file and then hit finish.

Running the utility will produce something like the following:
C:\Documents and Settings\chet\Desktop>migrateeul pdi_eul.eex

Oracle BI SE - EE Migration Assistant Version 10.1.3.4.0


Reading Configuration File...

Error reading configuration !!! Reverting to defaults...[DONE]

Parsing EUL export file C:\Documents and Settings\chet\Desktop\eul.eex...[DONE]

Repository creation started...

Processing Business Area : Business Area 1....[DONE]

Processing Business Area : Business Area 2....[DONE]

Processing Business Area : Business Area 3....[DONE]

Processing Business Area : Business Area 4....[DONE]

Processing Business Area : Business Area 5....[DONE]

Processing Business Area : Business Area 6....[DONE]

All Business Area(s) processed

The migrated repository is saved at C:\Documents and Settings\chet\Desktop\eul.rpd

Migration log is saved at C:\Documents and Settings\chet\Desktop\eul.migration.log

------------------------------------------
EUL MIGRATION SUCCESSFUL
------------------------------------------
Now on to the fun part, using that newly created RPD and making everything pretty.

Saturday, October 2, 2010

Fun with Service Accounts

Using a service account to access a production database, my login script returns the following:
SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 2 08:02:11 2010

Copyright (c) 1982, 2010, Oracle. All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options


***roles granted***

ROLE
-------------------------------
CONNECT
RESOURCE
DBA
SELECT_CATALOG_ROLE
EXECUTE_CATALOG_ROLE
DELETE_CATALOG_ROLE
EXP_FULL_DATABASE
IMP_FULL_DATABASE
OLAP_DBA
XDBADMIN
DATAPUMP_EXP_FULL_DATABASE
DATAPUMP_IMP_FULL_DATABASE
XDB_SET_INVOKER
OLAP_XS_ADMIN
JAVA_ADMIN
HS_ADMIN_ROLE
JAVA_DEPLOY
GATHER_SYSTEM_STATISTICS
SCHEDULER_ADMIN
CERIDIAN_ROLE

20 rows selected.


***system privileges granted***

PRIVILEGE
-------------------------------
ADMINISTER ANY SQL TUNING SET
ADMINISTER DATABASE TRIGGER
ADMINISTER RESOURCE MANAGER
ADMINISTER SQL MANAGEMENT OBJECT
ADMINISTER SQL TUNING SET
ADVISOR
ALTER ANY ASSEMBLY
ALTER ANY CLUSTER
ALTER ANY CUBE
ALTER ANY CUBE DIMENSION
ALTER ANY DIMENSION
ALTER ANY EDITION
ALTER ANY EVALUATION CONTEXT
ALTER ANY INDEX
ALTER ANY INDEXTYPE
ALTER ANY LIBRARY
ALTER ANY MATERIALIZED VIEW
ALTER ANY MINING MODEL
ALTER ANY OPERATOR
ALTER ANY OUTLINE
ALTER ANY PROCEDURE
ALTER ANY ROLE
ALTER ANY RULE
ALTER ANY RULE SET
ALTER ANY SEQUENCE
ALTER ANY SQL PROFILE
ALTER ANY TABLE
ALTER ANY TRIGGER
ALTER ANY TYPE
ALTER DATABASE
ALTER PROFILE
ALTER RESOURCE COST
ALTER ROLLBACK SEGMENT
ALTER SESSION
ALTER SYSTEM
ALTER TABLESPACE
ALTER USER
ANALYZE ANY
ANALYZE ANY DICTIONARY
AUDIT ANY
AUDIT SYSTEM
BACKUP ANY TABLE
BECOME USER
CHANGE NOTIFICATION
COMMENT ANY MINING MODEL
COMMENT ANY TABLE
CREATE ANY ASSEMBLY
CREATE ANY CLUSTER
CREATE ANY CONTEXT
CREATE ANY CUBE
CREATE ANY CUBE BUILD PROCESS
CREATE ANY CUBE DIMENSION
CREATE ANY DIMENSION
CREATE ANY DIRECTORY
CREATE ANY EDITION
CREATE ANY EVALUATION CONTEXT
CREATE ANY INDEX
CREATE ANY INDEXTYPE
CREATE ANY JOB
CREATE ANY LIBRARY
CREATE ANY MATERIALIZED VIEW
CREATE ANY MEASURE FOLDER
CREATE ANY MINING MODEL
CREATE ANY OPERATOR
CREATE ANY OUTLINE
CREATE ANY PROCEDURE
CREATE ANY RULE
CREATE ANY RULE SET
CREATE ANY SEQUENCE
CREATE ANY SQL PROFILE
CREATE ANY SYNONYM
CREATE ANY TABLE
CREATE ANY TRIGGER
CREATE ANY TYPE
CREATE ANY VIEW
CREATE ASSEMBLY
CREATE CLUSTER

PRIVILEGE
-------------------------------
CREATE CUBE
CREATE CUBE BUILD PROCESS
CREATE CUBE DIMENSION
CREATE DATABASE LINK
CREATE DIMENSION
CREATE EVALUATION CONTEXT
CREATE EXTERNAL JOB
CREATE INDEXTYPE
CREATE JOB
CREATE LIBRARY
CREATE MATERIALIZED VIEW
CREATE MEASURE FOLDER
CREATE MINING MODEL
CREATE OPERATOR
CREATE PROCEDURE
CREATE PROFILE
CREATE PUBLIC DATABASE LINK
CREATE PUBLIC SYNONYM
CREATE ROLE
CREATE ROLLBACK SEGMENT
CREATE RULE
CREATE RULE SET
CREATE SEQUENCE
CREATE SESSION
CREATE SYNONYM
CREATE TABLE
CREATE TABLESPACE
CREATE TRIGGER
CREATE TYPE
CREATE USER
CREATE VIEW
DEBUG ANY PROCEDURE
DEBUG CONNECT SESSION
DELETE ANY CUBE DIMENSION
DELETE ANY MEASURE FOLDER
DELETE ANY TABLE
DEQUEUE ANY QUEUE
DROP ANY ASSEMBLY
DROP ANY CLUSTER
DROP ANY CONTEXT
DROP ANY CUBE
DROP ANY CUBE BUILD PROCESS
DROP ANY CUBE DIMENSION
DROP ANY DIMENSION
DROP ANY DIRECTORY
DROP ANY EDITION
DROP ANY EVALUATION CONTEXT
DROP ANY INDEX
DROP ANY INDEXTYPE
DROP ANY LIBRARY
DROP ANY MATERIALIZED VIEW
DROP ANY MEASURE FOLDER
DROP ANY MINING MODEL
DROP ANY OPERATOR
DROP ANY OUTLINE
DROP ANY PROCEDURE
DROP ANY ROLE
DROP ANY RULE
DROP ANY RULE SET
DROP ANY SEQUENCE
DROP ANY SQL PROFILE
DROP ANY SYNONYM
DROP ANY TABLE
DROP ANY TRIGGER
DROP ANY TYPE
DROP ANY VIEW
DROP PROFILE
DROP PUBLIC DATABASE LINK
DROP PUBLIC SYNONYM
DROP ROLLBACK SEGMENT
DROP TABLESPACE
DROP USER
ENQUEUE ANY QUEUE
EXECUTE ANY ASSEMBLY
EXECUTE ANY CLASS
EXECUTE ANY EVALUATION CONTEXT
EXECUTE ANY INDEXTYPE

PRIVILEGE
-------------------------------
EXECUTE ANY LIBRARY
EXECUTE ANY OPERATOR
EXECUTE ANY PROCEDURE
EXECUTE ANY PROGRAM
EXECUTE ANY RULE
EXECUTE ANY RULE SET
EXECUTE ANY TYPE
EXECUTE ASSEMBLY
EXPORT FULL DATABASE
FLASHBACK ANY TABLE
FLASHBACK ARCHIVE ADMINISTER
FORCE ANY TRANSACTION
FORCE TRANSACTION
GLOBAL QUERY REWRITE
GRANT ANY OBJECT PRIVILEGE
GRANT ANY PRIVILEGE
GRANT ANY ROLE
IMPORT FULL DATABASE
INSERT ANY CUBE DIMENSION
INSERT ANY MEASURE FOLDER
INSERT ANY TABLE
LOCK ANY TABLE
MANAGE ANY FILE GROUP
MANAGE ANY QUEUE
MANAGE FILE GROUP
MANAGE SCHEDULER
MANAGE TABLESPACE
MERGE ANY VIEW
ON COMMIT REFRESH
QUERY REWRITE
READ ANY FILE GROUP
RESTRICTED SESSION
RESUMABLE
SELECT ANY CUBE
SELECT ANY CUBE DIMENSION
SELECT ANY DICTIONARY
SELECT ANY MINING MODEL
SELECT ANY SEQUENCE
SELECT ANY TABLE
SELECT ANY TRANSACTION
UNDER ANY TABLE
UNDER ANY TYPE
UNDER ANY VIEW
UNLIMITED TABLESPACE
UPDATE ANY CUBE
UPDATE ANY CUBE BUILD PROCESS
UPDATE ANY CUBE DIMENSION
UPDATE ANY TABLE

202 rows selected.
Awesome!