An approach might be to have the end user put the sql script on a drop directory and then use some NSH scripting to pick up the file and add it or create a new BLPackage.
I have done something similar using scripting to create a component, add to a BLPackage and then destroy the component. The script I created for this is on the wiki.
When you create the BLP, you can either script the additional of the external commands or possibly have a generic BLP and add the asset to the package and move to the start.
That way the script would be deposited to the target server first and then you could invoke SQL Plus.
I am doing something similar. The user is going to drop the sql script into a staging directory on a server which has bladelogic agent and sqlplus installed. I create one static package with dynamic parameters for database username, password, server and sid. I deploy the package to that server which in turn invokes sqlplus, connects to the right db and executes the sql script from the staging directory.
This seemed to be the best option as the customer was willing to install oracle client / sqlplus on all the servers.
what you could do is instead of the file being dropped on the target server, get them to drop it to a shared area on the App Server and use the BLP to pickup and drop to the target.
This will then eliminate the possibility that the file is dropped in the wrong location and the script fails because it can't find the file.
another idea to toy with ?